├── .env.example ├── .gitattributes ├── .gitignore ├── app ├── Console │ ├── Commands │ │ └── Inspire.php │ └── Kernel.php ├── Events │ └── Event.php ├── Exceptions │ └── Handler.php ├── Http │ ├── Controllers │ │ ├── Auth │ │ │ ├── AuthController.php │ │ │ └── PasswordController.php │ │ └── Controller.php │ ├── Kernel.php │ ├── Middleware │ │ ├── Authenticate.php │ │ ├── EncryptCookies.php │ │ ├── RedirectIfAuthenticated.php │ │ └── VerifyCsrfToken.php │ ├── Requests │ │ └── Request.php │ └── routes.php ├── Jobs │ └── Job.php ├── Listeners │ └── .gitkeep ├── Providers │ ├── AppServiceProvider.php │ ├── EventServiceProvider.php │ └── RouteServiceProvider.php └── User.php ├── artisan ├── bootstrap ├── app.php ├── autoload.php └── cache │ └── .gitignore ├── bower.json ├── composer.json ├── composer.lock ├── config ├── app.php ├── auth.php ├── broadcasting.php ├── cache.php ├── compile.php ├── database.php ├── filesystems.php ├── mail.php ├── queue.php ├── services.php ├── session.php └── view.php ├── database ├── .gitignore ├── factories │ └── ModelFactory.php ├── migrations │ ├── .gitkeep │ ├── 2014_10_12_000000_create_users_table.php │ └── 2014_10_12_100000_create_password_resets_table.php └── seeds │ ├── .gitkeep │ ├── DatabaseSeeder.php │ └── UserTableSeeder.php ├── gulpfile.js ├── package.json ├── phpspec.yml ├── phpunit.xml ├── public ├── .htaccess ├── assets │ ├── css │ │ ├── all.css │ │ └── all.css.map │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── LICENSE.txt │ │ ├── Material-Design-Icons.eot │ │ ├── Material-Design-Icons.svg │ │ ├── Material-Design-Icons.ttf │ │ ├── Material-Design-Icons.woff │ │ ├── RobotoDraftBold.woff │ │ ├── RobotoDraftBold.woff2 │ │ ├── RobotoDraftItalic.woff │ │ ├── RobotoDraftItalic.woff2 │ │ ├── RobotoDraftMedium.woff │ │ ├── RobotoDraftMedium.woff2 │ │ ├── RobotoDraftRegular.woff │ │ ├── RobotoDraftRegular.woff2 │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ ├── js │ │ ├── all.js │ │ └── all.js.map │ ├── svg-loaders │ │ ├── audio.svg │ │ ├── ball-triangle.svg │ │ ├── bars.svg │ │ ├── circles.svg │ │ ├── grid.svg │ │ ├── hearts.svg │ │ ├── oval.svg │ │ ├── puff.svg │ │ ├── rings.svg │ │ ├── spinning-circles.svg │ │ ├── tail-spin.svg │ │ └── three-dots.svg │ └── vue │ │ └── main.js ├── css │ ├── app.css │ └── app.css.map ├── favicon.ico ├── index.php └── robots.txt ├── readme.md ├── resources ├── assets │ ├── js │ │ ├── app.vue │ │ ├── components │ │ │ ├── loader.vue │ │ │ └── sidebar.vue │ │ ├── main.js │ │ ├── storage.js │ │ └── views │ │ │ ├── dashboard-view.vue │ │ │ ├── login-view.vue │ │ │ └── user-view.vue │ └── less │ │ ├── _colors.less │ │ ├── custom.less │ │ ├── material │ │ ├── _alerts.less │ │ ├── _buttons.less │ │ ├── _cards.less │ │ ├── _checkboxes.less │ │ ├── _colors.less │ │ ├── _dialogs.less │ │ ├── _dividers.less │ │ ├── _icons-material-design.less │ │ ├── _icons.less │ │ ├── _inputs.less │ │ ├── _labels.less │ │ ├── _lists.less │ │ ├── _mixins-fullpalette.less │ │ ├── _mixins.less │ │ ├── _navbar.less │ │ ├── _panels.less │ │ ├── _plugin-dropdownjs.less │ │ ├── _plugin-nouislider.less │ │ ├── _plugin-selectize.less │ │ ├── _plugin-snackbarjs.less │ │ ├── _popups.less │ │ ├── _progress.less │ │ ├── _radios.less │ │ ├── _shadows.less │ │ ├── _tabs.less │ │ ├── _togglebutton.less │ │ ├── _variables.less │ │ ├── _welljumbo.less │ │ ├── material-fullpalette.less │ │ ├── material.less │ │ ├── ripples.less │ │ └── roboto.less │ │ └── sb │ │ ├── mixins.less │ │ ├── sb-admin-2.less │ │ └── variables.less ├── lang │ └── en │ │ ├── pagination.php │ │ ├── passwords.php │ │ └── validation.php └── views │ ├── errors │ └── 503.blade.php │ ├── home.blade.php │ └── vendor │ └── .gitkeep ├── server.php ├── storage ├── app │ └── .gitignore ├── database.sqlite ├── framework │ ├── .gitignore │ ├── cache │ │ └── .gitignore │ ├── sessions │ │ └── .gitignore │ └── views │ │ └── .gitignore └── logs │ └── .gitignore └── tests ├── ExampleTest.php └── TestCase.php /.env.example: -------------------------------------------------------------------------------- 1 | APP_ENV=local 2 | APP_DEBUG=true 3 | APP_KEY=SomeRandomString 4 | 5 | DB_HOST=localhost 6 | DB_DATABASE=homestead 7 | DB_USERNAME=homestead 8 | DB_PASSWORD=secret 9 | 10 | CACHE_DRIVER=file 11 | SESSION_DRIVER=file 12 | QUEUE_DRIVER=sync 13 | 14 | MAIL_DRIVER=smtp 15 | MAIL_HOST=mailtrap.io 16 | MAIL_PORT=2525 17 | MAIL_USERNAME=null 18 | MAIL_PASSWORD=null 19 | MAIL_ENCRYPTION=null -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | *.css linguist-vendored 3 | *.less linguist-vendored 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor 2 | /node_modules 3 | /bower_components 4 | .env 5 | -------------------------------------------------------------------------------- /app/Console/Commands/Inspire.php: -------------------------------------------------------------------------------- 1 | comment(PHP_EOL.Inspiring::quote().PHP_EOL); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/Console/Kernel.php: -------------------------------------------------------------------------------- 1 | command('inspire') 28 | ->hourly(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Events/Event.php: -------------------------------------------------------------------------------- 1 | ajax()) 45 | { 46 | return response()->json(['success' => false, 'message' => 'Record not found'], 404); 47 | } 48 | } 49 | 50 | return parent::render($request, $e); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/AuthController.php: -------------------------------------------------------------------------------- 1 | middleware('guest', ['except' => 'getLogout']); 33 | } 34 | 35 | /** 36 | * Get a validator for an incoming registration request. 37 | * 38 | * @param array $data 39 | * @return \Illuminate\Contracts\Validation\Validator 40 | */ 41 | protected function validator(array $data) 42 | { 43 | return Validator::make($data, [ 44 | 'name' => 'required|max:255', 45 | 'email' => 'required|email|max:255|unique:users', 46 | 'password' => 'required|confirmed|min:6', 47 | ]); 48 | } 49 | 50 | /** 51 | * Create a new user instance after a valid registration. 52 | * 53 | * @param array $data 54 | * @return User 55 | */ 56 | protected function create(array $data) 57 | { 58 | return User::create([ 59 | 'name' => $data['name'], 60 | 'email' => $data['email'], 61 | 'password' => bcrypt($data['password']), 62 | ]); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/PasswordController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | \App\Http\Middleware\Authenticate::class, 30 | 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 31 | 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 32 | ]; 33 | } 34 | -------------------------------------------------------------------------------- /app/Http/Middleware/Authenticate.php: -------------------------------------------------------------------------------- 1 | auth = $auth; 26 | } 27 | 28 | /** 29 | * Handle an incoming request. 30 | * 31 | * @param \Illuminate\Http\Request $request 32 | * @param \Closure $next 33 | * @return mixed 34 | */ 35 | public function handle($request, Closure $next) 36 | { 37 | if ($this->auth->guest()) { 38 | if ($request->ajax()) { 39 | return response('Unauthorized.', 401); 40 | } else { 41 | return redirect()->guest('auth/login'); 42 | } 43 | } 44 | 45 | return $next($request); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/Http/Middleware/EncryptCookies.php: -------------------------------------------------------------------------------- 1 | auth = $auth; 26 | } 27 | 28 | /** 29 | * Handle an incoming request. 30 | * 31 | * @param \Illuminate\Http\Request $request 32 | * @param \Closure $next 33 | * @return mixed 34 | */ 35 | public function handle($request, Closure $next) 36 | { 37 | if ($this->auth->check()) { 38 | return redirect('/home'); 39 | } 40 | 41 | return $next($request); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/Http/Middleware/VerifyCsrfToken.php: -------------------------------------------------------------------------------- 1 | $request->get('email'), 'password' => $request->get('password')])) { 22 | return response()->json(['success' => true, 'message' => 'Login successfully performed'], 200); 23 | } 24 | 25 | return response()->json(['success' => false, 'message' => 'Unable to login'], 401); 26 | }); 27 | 28 | Route::group(['middleware' => 'auth'], function() { 29 | 30 | post('logout', function() 31 | { 32 | Auth::logout(); 33 | return response()->json(['success' => true, 'message' => 'You logout with success'], 200); 34 | }); 35 | 36 | get('users', function() { 37 | $users = App\User::all(); 38 | 39 | return response()->json(['success' => 'true', 'message' => 'Loading users', 'data' => ['users' => $users->toJson()]], 200); 40 | }); 41 | }); 42 | -------------------------------------------------------------------------------- /app/Jobs/Job.php: -------------------------------------------------------------------------------- 1 | [ 17 | 'App\Listeners\EventListener', 18 | ], 19 | ]; 20 | 21 | /** 22 | * Register any other events for your application. 23 | * 24 | * @param \Illuminate\Contracts\Events\Dispatcher $events 25 | * @return void 26 | */ 27 | public function boot(DispatcherContract $events) 28 | { 29 | parent::boot($events); 30 | 31 | // 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/Providers/RouteServiceProvider.php: -------------------------------------------------------------------------------- 1 | group(['namespace' => $this->namespace], function ($router) { 41 | require app_path('Http/routes.php'); 42 | }); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/User.php: -------------------------------------------------------------------------------- 1 | make(Illuminate\Contracts\Console\Kernel::class); 32 | 33 | $status = $kernel->handle( 34 | $input = new Symfony\Component\Console\Input\ArgvInput, 35 | new Symfony\Component\Console\Output\ConsoleOutput 36 | ); 37 | 38 | /* 39 | |-------------------------------------------------------------------------- 40 | | Shutdown The Application 41 | |-------------------------------------------------------------------------- 42 | | 43 | | Once Artisan has finished running. We will fire off the shutdown events 44 | | so that any final work may be done by the application before we shut 45 | | down the process. This is the last thing to happen to the request. 46 | | 47 | */ 48 | 49 | $kernel->terminate($input, $status); 50 | 51 | exit($status); 52 | -------------------------------------------------------------------------------- /bootstrap/app.php: -------------------------------------------------------------------------------- 1 | singleton( 30 | Illuminate\Contracts\Http\Kernel::class, 31 | App\Http\Kernel::class 32 | ); 33 | 34 | $app->singleton( 35 | Illuminate\Contracts\Console\Kernel::class, 36 | App\Console\Kernel::class 37 | ); 38 | 39 | $app->singleton( 40 | Illuminate\Contracts\Debug\ExceptionHandler::class, 41 | App\Exceptions\Handler::class 42 | ); 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | Return The Application 47 | |-------------------------------------------------------------------------- 48 | | 49 | | This script returns the application instance. The instance is given to 50 | | the calling script so we can separate the building of the instances 51 | | from the actual running of the application and sending responses. 52 | | 53 | */ 54 | 55 | return $app; 56 | -------------------------------------------------------------------------------- /bootstrap/autoload.php: -------------------------------------------------------------------------------- 1 | =5.5.9", 9 | "laravel/framework": "5.1.*" 10 | }, 11 | "require-dev": { 12 | "fzaninotto/faker": "~1.4", 13 | "mockery/mockery": "0.9.*", 14 | "phpunit/phpunit": "~4.0", 15 | "phpspec/phpspec": "~2.1" 16 | }, 17 | "autoload": { 18 | "classmap": [ 19 | "database" 20 | ], 21 | "psr-4": { 22 | "App\\": "app/" 23 | } 24 | }, 25 | "autoload-dev": { 26 | "classmap": [ 27 | "tests/TestCase.php" 28 | ] 29 | }, 30 | "scripts": { 31 | "post-install-cmd": [ 32 | "php artisan clear-compiled", 33 | "php artisan optimize" 34 | ], 35 | "post-update-cmd": [ 36 | "php artisan clear-compiled", 37 | "php artisan optimize" 38 | ], 39 | "post-root-package-install": [ 40 | "php -r \"copy('.env.example', '.env');\"" 41 | ], 42 | "post-create-project-cmd": [ 43 | "php artisan key:generate" 44 | ] 45 | }, 46 | "config": { 47 | "preferred-install": "dist" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /config/app.php: -------------------------------------------------------------------------------- 1 | env('APP_DEBUG'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Application URL 21 | |-------------------------------------------------------------------------- 22 | | 23 | | This URL is used by the console to properly generate URLs when using 24 | | the Artisan command line tool. You should set this to the root of 25 | | your application so that it is used when running Artisan tasks. 26 | | 27 | */ 28 | 29 | 'url' => 'http://localhost', 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Application Timezone 34 | |-------------------------------------------------------------------------- 35 | | 36 | | Here you may specify the default timezone for your application, which 37 | | will be used by the PHP date and date-time functions. We have gone 38 | | ahead and set this to a sensible default for you out of the box. 39 | | 40 | */ 41 | 42 | 'timezone' => 'UTC', 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | Application Locale Configuration 47 | |-------------------------------------------------------------------------- 48 | | 49 | | The application locale determines the default locale that will be used 50 | | by the translation service provider. You are free to set this value 51 | | to any of the locales which will be supported by the application. 52 | | 53 | */ 54 | 55 | 'locale' => 'en', 56 | 57 | /* 58 | |-------------------------------------------------------------------------- 59 | | Application Fallback Locale 60 | |-------------------------------------------------------------------------- 61 | | 62 | | The fallback locale determines the locale to use when the current one 63 | | is not available. You may change the value to correspond to any of 64 | | the language folders that are provided through your application. 65 | | 66 | */ 67 | 68 | 'fallback_locale' => 'en', 69 | 70 | /* 71 | |-------------------------------------------------------------------------- 72 | | Encryption Key 73 | |-------------------------------------------------------------------------- 74 | | 75 | | This key is used by the Illuminate encrypter service and should be set 76 | | to a random, 32 character string, otherwise these encrypted strings 77 | | will not be safe. Please do this before deploying an application! 78 | | 79 | */ 80 | 81 | 'key' => env('APP_KEY', 'SomeRandomString'), 82 | 83 | 'cipher' => 'AES-256-CBC', 84 | 85 | /* 86 | |-------------------------------------------------------------------------- 87 | | Logging Configuration 88 | |-------------------------------------------------------------------------- 89 | | 90 | | Here you may configure the log settings for your application. Out of 91 | | the box, Laravel uses the Monolog PHP logging library. This gives 92 | | you a variety of powerful log handlers / formatters to utilize. 93 | | 94 | | Available Settings: "single", "daily", "syslog", "errorlog" 95 | | 96 | */ 97 | 98 | 'log' => 'single', 99 | 100 | /* 101 | |-------------------------------------------------------------------------- 102 | | Autoloaded Service Providers 103 | |-------------------------------------------------------------------------- 104 | | 105 | | The service providers listed here will be automatically loaded on the 106 | | request to your application. Feel free to add your own services to 107 | | this array to grant expanded functionality to your applications. 108 | | 109 | */ 110 | 111 | 'providers' => [ 112 | 113 | /* 114 | * Laravel Framework Service Providers... 115 | */ 116 | Illuminate\Foundation\Providers\ArtisanServiceProvider::class, 117 | Illuminate\Auth\AuthServiceProvider::class, 118 | Illuminate\Broadcasting\BroadcastServiceProvider::class, 119 | Illuminate\Bus\BusServiceProvider::class, 120 | Illuminate\Cache\CacheServiceProvider::class, 121 | Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, 122 | Illuminate\Routing\ControllerServiceProvider::class, 123 | Illuminate\Cookie\CookieServiceProvider::class, 124 | Illuminate\Database\DatabaseServiceProvider::class, 125 | Illuminate\Encryption\EncryptionServiceProvider::class, 126 | Illuminate\Filesystem\FilesystemServiceProvider::class, 127 | Illuminate\Foundation\Providers\FoundationServiceProvider::class, 128 | Illuminate\Hashing\HashServiceProvider::class, 129 | Illuminate\Mail\MailServiceProvider::class, 130 | Illuminate\Pagination\PaginationServiceProvider::class, 131 | Illuminate\Pipeline\PipelineServiceProvider::class, 132 | Illuminate\Queue\QueueServiceProvider::class, 133 | Illuminate\Redis\RedisServiceProvider::class, 134 | Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, 135 | Illuminate\Session\SessionServiceProvider::class, 136 | Illuminate\Translation\TranslationServiceProvider::class, 137 | Illuminate\Validation\ValidationServiceProvider::class, 138 | Illuminate\View\ViewServiceProvider::class, 139 | 140 | /* 141 | * Application Service Providers... 142 | */ 143 | App\Providers\AppServiceProvider::class, 144 | App\Providers\EventServiceProvider::class, 145 | App\Providers\RouteServiceProvider::class, 146 | 147 | ], 148 | 149 | /* 150 | |-------------------------------------------------------------------------- 151 | | Class Aliases 152 | |-------------------------------------------------------------------------- 153 | | 154 | | This array of class aliases will be registered when this application 155 | | is started. However, feel free to register as many as you wish as 156 | | the aliases are "lazy" loaded so they don't hinder performance. 157 | | 158 | */ 159 | 160 | 'aliases' => [ 161 | 162 | 'App' => Illuminate\Support\Facades\App::class, 163 | 'Artisan' => Illuminate\Support\Facades\Artisan::class, 164 | 'Auth' => Illuminate\Support\Facades\Auth::class, 165 | 'Blade' => Illuminate\Support\Facades\Blade::class, 166 | 'Bus' => Illuminate\Support\Facades\Bus::class, 167 | 'Cache' => Illuminate\Support\Facades\Cache::class, 168 | 'Config' => Illuminate\Support\Facades\Config::class, 169 | 'Cookie' => Illuminate\Support\Facades\Cookie::class, 170 | 'Crypt' => Illuminate\Support\Facades\Crypt::class, 171 | 'DB' => Illuminate\Support\Facades\DB::class, 172 | 'Eloquent' => Illuminate\Database\Eloquent\Model::class, 173 | 'Event' => Illuminate\Support\Facades\Event::class, 174 | 'File' => Illuminate\Support\Facades\File::class, 175 | 'Hash' => Illuminate\Support\Facades\Hash::class, 176 | 'Input' => Illuminate\Support\Facades\Input::class, 177 | 'Inspiring' => Illuminate\Foundation\Inspiring::class, 178 | 'Lang' => Illuminate\Support\Facades\Lang::class, 179 | 'Log' => Illuminate\Support\Facades\Log::class, 180 | 'Mail' => Illuminate\Support\Facades\Mail::class, 181 | 'Password' => Illuminate\Support\Facades\Password::class, 182 | 'Queue' => Illuminate\Support\Facades\Queue::class, 183 | 'Redirect' => Illuminate\Support\Facades\Redirect::class, 184 | 'Redis' => Illuminate\Support\Facades\Redis::class, 185 | 'Request' => Illuminate\Support\Facades\Request::class, 186 | 'Response' => Illuminate\Support\Facades\Response::class, 187 | 'Route' => Illuminate\Support\Facades\Route::class, 188 | 'Schema' => Illuminate\Support\Facades\Schema::class, 189 | 'Session' => Illuminate\Support\Facades\Session::class, 190 | 'Storage' => Illuminate\Support\Facades\Storage::class, 191 | 'URL' => Illuminate\Support\Facades\URL::class, 192 | 'Validator' => Illuminate\Support\Facades\Validator::class, 193 | 'View' => Illuminate\Support\Facades\View::class, 194 | 195 | ], 196 | 197 | ]; 198 | -------------------------------------------------------------------------------- /config/auth.php: -------------------------------------------------------------------------------- 1 | 'eloquent', 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Authentication Model 23 | |-------------------------------------------------------------------------- 24 | | 25 | | When using the "Eloquent" authentication driver, we need to know which 26 | | Eloquent model should be used to retrieve your users. Of course, it 27 | | is often just the "User" model but you may use whatever you like. 28 | | 29 | */ 30 | 31 | 'model' => App\User::class, 32 | 33 | /* 34 | |-------------------------------------------------------------------------- 35 | | Authentication Table 36 | |-------------------------------------------------------------------------- 37 | | 38 | | When using the "Database" authentication driver, we need to know which 39 | | table should be used to retrieve your users. We have chosen a basic 40 | | default value but you may easily change it to any table you like. 41 | | 42 | */ 43 | 44 | 'table' => 'users', 45 | 46 | /* 47 | |-------------------------------------------------------------------------- 48 | | Password Reset Settings 49 | |-------------------------------------------------------------------------- 50 | | 51 | | Here you may set the options for resetting passwords including the view 52 | | that is your password reset e-mail. You can also set the name of the 53 | | table that maintains all of the reset tokens for your application. 54 | | 55 | | The expire time is the number of minutes that the reset token should be 56 | | considered valid. This security feature keeps tokens short-lived so 57 | | they have less time to be guessed. You may change this as needed. 58 | | 59 | */ 60 | 61 | 'password' => [ 62 | 'email' => 'emails.password', 63 | 'table' => 'password_resets', 64 | 'expire' => 60, 65 | ], 66 | 67 | ]; 68 | -------------------------------------------------------------------------------- /config/broadcasting.php: -------------------------------------------------------------------------------- 1 | env('BROADCAST_DRIVER', 'pusher'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Broadcast Connections 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here you may define all of the broadcast connections that will be used 24 | | to broadcast events to other systems or over websockets. Samples of 25 | | each available type of connection are provided inside this array. 26 | | 27 | */ 28 | 29 | 'connections' => [ 30 | 31 | 'pusher' => [ 32 | 'driver' => 'pusher', 33 | 'key' => env('PUSHER_KEY'), 34 | 'secret' => env('PUSHER_SECRET'), 35 | 'app_id' => env('PUSHER_APP_ID'), 36 | ], 37 | 38 | 'redis' => [ 39 | 'driver' => 'redis', 40 | 'connection' => 'default', 41 | ], 42 | 43 | 'log' => [ 44 | 'driver' => 'log', 45 | ], 46 | 47 | ], 48 | 49 | ]; 50 | -------------------------------------------------------------------------------- /config/cache.php: -------------------------------------------------------------------------------- 1 | env('CACHE_DRIVER', 'file'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Cache Stores 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here you may define all of the cache "stores" for your application as 24 | | well as their drivers. You may even define multiple stores for the 25 | | same cache driver to group types of items stored in your caches. 26 | | 27 | */ 28 | 29 | 'stores' => [ 30 | 31 | 'apc' => [ 32 | 'driver' => 'apc', 33 | ], 34 | 35 | 'array' => [ 36 | 'driver' => 'array', 37 | ], 38 | 39 | 'database' => [ 40 | 'driver' => 'database', 41 | 'table' => 'cache', 42 | 'connection' => null, 43 | ], 44 | 45 | 'file' => [ 46 | 'driver' => 'file', 47 | 'path' => storage_path('framework/cache'), 48 | ], 49 | 50 | 'memcached' => [ 51 | 'driver' => 'memcached', 52 | 'servers' => [ 53 | [ 54 | 'host' => '127.0.0.1', 'port' => 11211, 'weight' => 100, 55 | ], 56 | ], 57 | ], 58 | 59 | 'redis' => [ 60 | 'driver' => 'redis', 61 | 'connection' => 'default', 62 | ], 63 | 64 | ], 65 | 66 | /* 67 | |-------------------------------------------------------------------------- 68 | | Cache Key Prefix 69 | |-------------------------------------------------------------------------- 70 | | 71 | | When utilizing a RAM based store such as APC or Memcached, there might 72 | | be other applications utilizing the same cache. So, we'll specify a 73 | | value to get prefixed to all our keys so we can avoid collisions. 74 | | 75 | */ 76 | 77 | 'prefix' => 'laravel', 78 | 79 | ]; 80 | -------------------------------------------------------------------------------- /config/compile.php: -------------------------------------------------------------------------------- 1 | [ 17 | // 18 | ], 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Compiled File Providers 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may list service providers which define a "compiles" function 26 | | that returns additional files that should be compiled, providing an 27 | | easy way to get common files from any packages you are utilizing. 28 | | 29 | */ 30 | 31 | 'providers' => [ 32 | // 33 | ], 34 | 35 | ]; 36 | -------------------------------------------------------------------------------- /config/database.php: -------------------------------------------------------------------------------- 1 | PDO::FETCH_CLASS, 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Default Database Connection Name 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here you may specify which of the database connections below you wish 24 | | to use as your default connection for all database work. Of course 25 | | you may use many connections at once using the Database library. 26 | | 27 | */ 28 | 29 | 'default' => env('DB_CONNECTION', 'sqlite'), 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Database Connections 34 | |-------------------------------------------------------------------------- 35 | | 36 | | Here are each of the database connections setup for your application. 37 | | Of course, examples of configuring each database platform that is 38 | | supported by Laravel is shown below to make development simple. 39 | | 40 | | 41 | | All database work in Laravel is done through the PHP PDO facilities 42 | | so make sure you have the driver for your particular database of 43 | | choice installed on your machine before you begin development. 44 | | 45 | */ 46 | 47 | 'connections' => [ 48 | 49 | 'sqlite' => [ 50 | 'driver' => 'sqlite', 51 | 'database' => storage_path('database.sqlite'), 52 | 'prefix' => '', 53 | ], 54 | 55 | 'mysql' => [ 56 | 'driver' => 'mysql', 57 | 'host' => env('DB_HOST', 'localhost'), 58 | 'database' => env('DB_DATABASE', 'forge'), 59 | 'username' => env('DB_USERNAME', 'forge'), 60 | 'password' => env('DB_PASSWORD', ''), 61 | 'charset' => 'utf8', 62 | 'collation' => 'utf8_unicode_ci', 63 | 'prefix' => '', 64 | 'strict' => false, 65 | ], 66 | 67 | 'pgsql' => [ 68 | 'driver' => 'pgsql', 69 | 'host' => env('DB_HOST', 'localhost'), 70 | 'database' => env('DB_DATABASE', 'forge'), 71 | 'username' => env('DB_USERNAME', 'forge'), 72 | 'password' => env('DB_PASSWORD', ''), 73 | 'charset' => 'utf8', 74 | 'prefix' => '', 75 | 'schema' => 'public', 76 | ], 77 | 78 | 'sqlsrv' => [ 79 | 'driver' => 'sqlsrv', 80 | 'host' => env('DB_HOST', 'localhost'), 81 | 'database' => env('DB_DATABASE', 'forge'), 82 | 'username' => env('DB_USERNAME', 'forge'), 83 | 'password' => env('DB_PASSWORD', ''), 84 | 'charset' => 'utf8', 85 | 'prefix' => '', 86 | ], 87 | 88 | ], 89 | 90 | /* 91 | |-------------------------------------------------------------------------- 92 | | Migration Repository Table 93 | |-------------------------------------------------------------------------- 94 | | 95 | | This table keeps track of all the migrations that have already run for 96 | | your application. Using this information, we can determine which of 97 | | the migrations on disk haven't actually been run in the database. 98 | | 99 | */ 100 | 101 | 'migrations' => 'migrations', 102 | 103 | /* 104 | |-------------------------------------------------------------------------- 105 | | Redis Databases 106 | |-------------------------------------------------------------------------- 107 | | 108 | | Redis is an open source, fast, and advanced key-value store that also 109 | | provides a richer set of commands than a typical key-value systems 110 | | such as APC or Memcached. Laravel makes it easy to dig right in. 111 | | 112 | */ 113 | 114 | 'redis' => [ 115 | 116 | 'cluster' => false, 117 | 118 | 'default' => [ 119 | 'host' => '127.0.0.1', 120 | 'port' => 6379, 121 | 'database' => 0, 122 | ], 123 | 124 | ], 125 | 126 | ]; 127 | -------------------------------------------------------------------------------- /config/filesystems.php: -------------------------------------------------------------------------------- 1 | 'local', 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Default Cloud Filesystem Disk 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Many applications store files both locally and in the cloud. For this 26 | | reason, you may specify a default "cloud" driver here. This driver 27 | | will be bound as the Cloud disk implementation in the container. 28 | | 29 | */ 30 | 31 | 'cloud' => 's3', 32 | 33 | /* 34 | |-------------------------------------------------------------------------- 35 | | Filesystem Disks 36 | |-------------------------------------------------------------------------- 37 | | 38 | | Here you may configure as many filesystem "disks" as you wish, and you 39 | | may even configure multiple disks of the same driver. Defaults have 40 | | been setup for each driver as an example of the required options. 41 | | 42 | */ 43 | 44 | 'disks' => [ 45 | 46 | 'local' => [ 47 | 'driver' => 'local', 48 | 'root' => storage_path('app'), 49 | ], 50 | 51 | 'ftp' => [ 52 | 'driver' => 'ftp', 53 | 'host' => 'ftp.example.com', 54 | 'username' => 'your-username', 55 | 'password' => 'your-password', 56 | 57 | // Optional FTP Settings... 58 | // 'port' => 21, 59 | // 'root' => '', 60 | // 'passive' => true, 61 | // 'ssl' => true, 62 | // 'timeout' => 30, 63 | ], 64 | 65 | 's3' => [ 66 | 'driver' => 's3', 67 | 'key' => 'your-key', 68 | 'secret' => 'your-secret', 69 | 'region' => 'your-region', 70 | 'bucket' => 'your-bucket', 71 | ], 72 | 73 | 'rackspace' => [ 74 | 'driver' => 'rackspace', 75 | 'username' => 'your-username', 76 | 'key' => 'your-key', 77 | 'container' => 'your-container', 78 | 'endpoint' => 'https://identity.api.rackspacecloud.com/v2.0/', 79 | 'region' => 'IAD', 80 | 'url_type' => 'publicURL', 81 | ], 82 | 83 | ], 84 | 85 | ]; 86 | -------------------------------------------------------------------------------- /config/mail.php: -------------------------------------------------------------------------------- 1 | env('MAIL_DRIVER', 'smtp'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | SMTP Host Address 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may provide the host address of the SMTP server used by your 26 | | applications. A default option is provided that is compatible with 27 | | the Mailgun mail service which will provide reliable deliveries. 28 | | 29 | */ 30 | 31 | 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), 32 | 33 | /* 34 | |-------------------------------------------------------------------------- 35 | | SMTP Host Port 36 | |-------------------------------------------------------------------------- 37 | | 38 | | This is the SMTP port used by your application to deliver e-mails to 39 | | users of the application. Like the host we have set this value to 40 | | stay compatible with the Mailgun e-mail application by default. 41 | | 42 | */ 43 | 44 | 'port' => env('MAIL_PORT', 587), 45 | 46 | /* 47 | |-------------------------------------------------------------------------- 48 | | Global "From" Address 49 | |-------------------------------------------------------------------------- 50 | | 51 | | You may wish for all e-mails sent by your application to be sent from 52 | | the same address. Here, you may specify a name and address that is 53 | | used globally for all e-mails that are sent by your application. 54 | | 55 | */ 56 | 57 | 'from' => ['address' => null, 'name' => null], 58 | 59 | /* 60 | |-------------------------------------------------------------------------- 61 | | E-Mail Encryption Protocol 62 | |-------------------------------------------------------------------------- 63 | | 64 | | Here you may specify the encryption protocol that should be used when 65 | | the application send e-mail messages. A sensible default using the 66 | | transport layer security protocol should provide great security. 67 | | 68 | */ 69 | 70 | 'encryption' => env('MAIL_ENCRYPTION', 'tls'), 71 | 72 | /* 73 | |-------------------------------------------------------------------------- 74 | | SMTP Server Username 75 | |-------------------------------------------------------------------------- 76 | | 77 | | If your SMTP server requires a username for authentication, you should 78 | | set it here. This will get used to authenticate with your server on 79 | | connection. You may also set the "password" value below this one. 80 | | 81 | */ 82 | 83 | 'username' => env('MAIL_USERNAME'), 84 | 85 | /* 86 | |-------------------------------------------------------------------------- 87 | | SMTP Server Password 88 | |-------------------------------------------------------------------------- 89 | | 90 | | Here you may set the password required by your SMTP server to send out 91 | | messages from your application. This will be given to the server on 92 | | connection so that the application will be able to send messages. 93 | | 94 | */ 95 | 96 | 'password' => env('MAIL_PASSWORD'), 97 | 98 | /* 99 | |-------------------------------------------------------------------------- 100 | | Sendmail System Path 101 | |-------------------------------------------------------------------------- 102 | | 103 | | When using the "sendmail" driver to send e-mails, we will need to know 104 | | the path to where Sendmail lives on this server. A default path has 105 | | been provided here, which will work well on most of your systems. 106 | | 107 | */ 108 | 109 | 'sendmail' => '/usr/sbin/sendmail -bs', 110 | 111 | /* 112 | |-------------------------------------------------------------------------- 113 | | Mail "Pretend" 114 | |-------------------------------------------------------------------------- 115 | | 116 | | When this option is enabled, e-mail will not actually be sent over the 117 | | web and will instead be written to your application's logs files so 118 | | you may inspect the message. This is great for local development. 119 | | 120 | */ 121 | 122 | 'pretend' => false, 123 | 124 | ]; 125 | -------------------------------------------------------------------------------- /config/queue.php: -------------------------------------------------------------------------------- 1 | env('QUEUE_DRIVER', 'sync'), 20 | 21 | /* 22 | |-------------------------------------------------------------------------- 23 | | Queue Connections 24 | |-------------------------------------------------------------------------- 25 | | 26 | | Here you may configure the connection information for each server that 27 | | is used by your application. A default configuration has been added 28 | | for each back-end shipped with Laravel. You are free to add more. 29 | | 30 | */ 31 | 32 | 'connections' => [ 33 | 34 | 'sync' => [ 35 | 'driver' => 'sync', 36 | ], 37 | 38 | 'database' => [ 39 | 'driver' => 'database', 40 | 'table' => 'jobs', 41 | 'queue' => 'default', 42 | 'expire' => 60, 43 | ], 44 | 45 | 'beanstalkd' => [ 46 | 'driver' => 'beanstalkd', 47 | 'host' => 'localhost', 48 | 'queue' => 'default', 49 | 'ttr' => 60, 50 | ], 51 | 52 | 'sqs' => [ 53 | 'driver' => 'sqs', 54 | 'key' => 'your-public-key', 55 | 'secret' => 'your-secret-key', 56 | 'queue' => 'your-queue-url', 57 | 'region' => 'us-east-1', 58 | ], 59 | 60 | 'iron' => [ 61 | 'driver' => 'iron', 62 | 'host' => 'mq-aws-us-east-1.iron.io', 63 | 'token' => 'your-token', 64 | 'project' => 'your-project-id', 65 | 'queue' => 'your-queue-name', 66 | 'encrypt' => true, 67 | ], 68 | 69 | 'redis' => [ 70 | 'driver' => 'redis', 71 | 'connection' => 'default', 72 | 'queue' => 'default', 73 | 'expire' => 60, 74 | ], 75 | 76 | ], 77 | 78 | /* 79 | |-------------------------------------------------------------------------- 80 | | Failed Queue Jobs 81 | |-------------------------------------------------------------------------- 82 | | 83 | | These options configure the behavior of failed queue job logging so you 84 | | can control which database and table are used to store the jobs that 85 | | have failed. You may change them to any database / table you wish. 86 | | 87 | */ 88 | 89 | 'failed' => [ 90 | 'database' => 'mysql', 'table' => 'failed_jobs', 91 | ], 92 | 93 | ]; 94 | -------------------------------------------------------------------------------- /config/services.php: -------------------------------------------------------------------------------- 1 | [ 18 | 'domain' => '', 19 | 'secret' => '', 20 | ], 21 | 22 | 'mandrill' => [ 23 | 'secret' => '', 24 | ], 25 | 26 | 'ses' => [ 27 | 'key' => '', 28 | 'secret' => '', 29 | 'region' => 'us-east-1', 30 | ], 31 | 32 | 'stripe' => [ 33 | 'model' => App\User::class, 34 | 'key' => '', 35 | 'secret' => '', 36 | ], 37 | 38 | ]; 39 | -------------------------------------------------------------------------------- /config/session.php: -------------------------------------------------------------------------------- 1 | env('SESSION_DRIVER', 'file'), 20 | 21 | /* 22 | |-------------------------------------------------------------------------- 23 | | Session Lifetime 24 | |-------------------------------------------------------------------------- 25 | | 26 | | Here you may specify the number of minutes that you wish the session 27 | | to be allowed to remain idle before it expires. If you want them 28 | | to immediately expire on the browser closing, set that option. 29 | | 30 | */ 31 | 32 | 'lifetime' => 120, 33 | 34 | 'expire_on_close' => false, 35 | 36 | /* 37 | |-------------------------------------------------------------------------- 38 | | Session Encryption 39 | |-------------------------------------------------------------------------- 40 | | 41 | | This option allows you to easily specify that all of your session data 42 | | should be encrypted before it is stored. All encryption will be run 43 | | automatically by Laravel and you can use the Session like normal. 44 | | 45 | */ 46 | 47 | 'encrypt' => false, 48 | 49 | /* 50 | |-------------------------------------------------------------------------- 51 | | Session File Location 52 | |-------------------------------------------------------------------------- 53 | | 54 | | When using the native session driver, we need a location where session 55 | | files may be stored. A default has been set for you but a different 56 | | location may be specified. This is only needed for file sessions. 57 | | 58 | */ 59 | 60 | 'files' => storage_path('framework/sessions'), 61 | 62 | /* 63 | |-------------------------------------------------------------------------- 64 | | Session Database Connection 65 | |-------------------------------------------------------------------------- 66 | | 67 | | When using the "database" or "redis" session drivers, you may specify a 68 | | connection that should be used to manage these sessions. This should 69 | | correspond to a connection in your database configuration options. 70 | | 71 | */ 72 | 73 | 'connection' => null, 74 | 75 | /* 76 | |-------------------------------------------------------------------------- 77 | | Session Database Table 78 | |-------------------------------------------------------------------------- 79 | | 80 | | When using the "database" session driver, you may specify the table we 81 | | should use to manage the sessions. Of course, a sensible default is 82 | | provided for you; however, you are free to change this as needed. 83 | | 84 | */ 85 | 86 | 'table' => 'sessions', 87 | 88 | /* 89 | |-------------------------------------------------------------------------- 90 | | Session Sweeping Lottery 91 | |-------------------------------------------------------------------------- 92 | | 93 | | Some session drivers must manually sweep their storage location to get 94 | | rid of old sessions from storage. Here are the chances that it will 95 | | happen on a given request. By default, the odds are 2 out of 100. 96 | | 97 | */ 98 | 99 | 'lottery' => [2, 100], 100 | 101 | /* 102 | |-------------------------------------------------------------------------- 103 | | Session Cookie Name 104 | |-------------------------------------------------------------------------- 105 | | 106 | | Here you may change the name of the cookie used to identify a session 107 | | instance by ID. The name specified here will get used every time a 108 | | new session cookie is created by the framework for every driver. 109 | | 110 | */ 111 | 112 | 'cookie' => 'laravel_session', 113 | 114 | /* 115 | |-------------------------------------------------------------------------- 116 | | Session Cookie Path 117 | |-------------------------------------------------------------------------- 118 | | 119 | | The session cookie path determines the path for which the cookie will 120 | | be regarded as available. Typically, this will be the root path of 121 | | your application but you are free to change this when necessary. 122 | | 123 | */ 124 | 125 | 'path' => '/', 126 | 127 | /* 128 | |-------------------------------------------------------------------------- 129 | | Session Cookie Domain 130 | |-------------------------------------------------------------------------- 131 | | 132 | | Here you may change the domain of the cookie used to identify a session 133 | | in your application. This will determine which domains the cookie is 134 | | available to in your application. A sensible default has been set. 135 | | 136 | */ 137 | 138 | 'domain' => null, 139 | 140 | /* 141 | |-------------------------------------------------------------------------- 142 | | HTTPS Only Cookies 143 | |-------------------------------------------------------------------------- 144 | | 145 | | By setting this option to true, session cookies will only be sent back 146 | | to the server if the browser has a HTTPS connection. This will keep 147 | | the cookie from being sent to you if it can not be done securely. 148 | | 149 | */ 150 | 151 | 'secure' => false, 152 | 153 | ]; 154 | -------------------------------------------------------------------------------- /config/view.php: -------------------------------------------------------------------------------- 1 | [ 17 | realpath(base_path('resources/views')), 18 | ], 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Compiled View Path 23 | |-------------------------------------------------------------------------- 24 | | 25 | | This option determines where all the compiled Blade templates will be 26 | | stored for your application. Typically, this is within the storage 27 | | directory. However, as usual, you are free to change this value. 28 | | 29 | */ 30 | 31 | 'compiled' => realpath(storage_path('framework/views')), 32 | 33 | ]; 34 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite 2 | -------------------------------------------------------------------------------- /database/factories/ModelFactory.php: -------------------------------------------------------------------------------- 1 | define(App\User::class, function ($faker) { 15 | return [ 16 | 'name' => $faker->name, 17 | 'email' => $faker->email, 18 | 'password' => str_random(10), 19 | 'remember_token' => str_random(10), 20 | ]; 21 | }); 22 | -------------------------------------------------------------------------------- /database/migrations/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/database/migrations/.gitkeep -------------------------------------------------------------------------------- /database/migrations/2014_10_12_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 17 | $table->string('name'); 18 | $table->string('email')->unique(); 19 | $table->string('password', 60); 20 | $table->rememberToken(); 21 | $table->timestamps(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | * 28 | * @return void 29 | */ 30 | public function down() 31 | { 32 | Schema::drop('users'); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_100000_create_password_resets_table.php: -------------------------------------------------------------------------------- 1 | string('email')->index(); 17 | $table->string('token')->index(); 18 | $table->timestamp('created_at'); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | * 25 | * @return void 26 | */ 27 | public function down() 28 | { 29 | Schema::drop('password_resets'); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /database/seeds/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/database/seeds/.gitkeep -------------------------------------------------------------------------------- /database/seeds/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | call('UserTableSeeder'); 18 | 19 | Model::reguard(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /database/seeds/UserTableSeeder.php: -------------------------------------------------------------------------------- 1 | truncate(); 16 | 17 | User::create(['name' => 'John Doe', 'email' => 'john@doe.com', 'password' => bcrypt('secret')]); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var elixir = require('laravel-elixir'); 2 | var vueify = require('laravel-elixir-browserify').init("vueify"); 3 | 4 | /* 5 | |-------------------------------------------------------------------------- 6 | | Elixir Asset Management 7 | |-------------------------------------------------------------------------- 8 | | 9 | | Elixir provides a clean, fluent API for defining some basic Gulp tasks 10 | | for your Laravel application. By default, we are compiling the Less 11 | | file for our application, as well as publishing vendor resources. 12 | | 13 | */ 14 | 15 | elixir(function(mix) { 16 | 17 | mix.vueify('main.js', {insertGlobals: true, transform: "vueify", output: "public/assets/vue",}); 18 | 19 | mix.copy('bower_components/startbootstrap-sb-admin-2/less', 'resources/assets/less/sb'); 20 | mix.copy('bower_components/bootstrap-material-design/less', 'resources/assets/less/material'); 21 | mix.copy('bower_components/bootstrap-material-design/dist/fonts', 'public/assets/fonts'); 22 | mix.copy('bower_components/font-awesome/fonts', 'public/assets/fonts'); 23 | mix.copy('bower_components/bootstrap/dist/fonts', 'public/assets/fonts'); 24 | mix.copy('bower_components/svg-loaders/svg-loaders', 'public/assets/svg-loaders'); 25 | 26 | mix.less('custom.less'); 27 | 28 | mix.styles([ 29 | 'bower_components/bootstrap/dist/css/bootstrap.min.css', 30 | 'bower_components/font-awesome/css/font-awesome.min.css', 31 | 'bower_components/snackbarjs/dist/snackbar.min.css', 32 | 'bower_components/metisMenu/dist/metisMenu.min.css', 33 | 'bower_components/startbootstrap-sb-admin-2/dist/css/timeline.css', 34 | 'bower_components/startbootstrap-sb-admin-2/dist/css/sb-admin-2.css', 35 | 'public/css/app.css' 36 | ], 'public/assets/css', './'); 37 | 38 | mix.scripts([ 39 | 'bower_components/jquery/dist/jquery.min.js', 40 | 'bower_components/underscore/underscore-min.js', 41 | 'bower_components/bootstrap/dist/js/bootstrap.min.js', 42 | 'bower_components/moment/moment.js', 43 | 'bower_components/moment/locale/pt-br.js', 44 | 'bower_components/bootstrap-material-design/dist/js/ripples.min.js', 45 | 'bower_components/bootstrap-material-design/dist/js/material.min.js', 46 | 'bower_components/snackbarjs/dist/snackbar.min.js', 47 | 'bower_components/metisMenu/dist/metisMenu.js', 48 | 'bower_components/startbootstrap-sb-admin-2/dist/js/sb-admin-2.js' 49 | ], 'public/assets/js', './'); 50 | }); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "devDependencies": { 4 | "gulp": "^3.8.8", 5 | "laravel-elixir": "^2.0.0" 6 | }, 7 | "dependencies": { 8 | "director": "^1.2.8", 9 | "insert-css": "^0.2.0", 10 | "laravel-elixir-browserify": "^0.8.1", 11 | "less": "^2.5.1", 12 | "vue": "^0.12.1", 13 | "vue-resource": "^0.1.3", 14 | "vueify": "^1.1.5" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /phpspec.yml: -------------------------------------------------------------------------------- 1 | suites: 2 | main: 3 | namespace: App 4 | psr4_prefix: App 5 | src_path: app -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 14 | ./tests/ 15 | 16 | 17 | 18 | 19 | app/ 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Redirect Trailing Slashes... 9 | RewriteRule ^(.*)/$ /$1 [L,R=301] 10 | 11 | # Handle Front Controller... 12 | RewriteCond %{REQUEST_FILENAME} !-d 13 | RewriteCond %{REQUEST_FILENAME} !-f 14 | RewriteRule ^ index.php [L] 15 | 16 | -------------------------------------------------------------------------------- /public/assets/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /public/assets/fonts/Material-Design-Icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/Material-Design-Icons.eot -------------------------------------------------------------------------------- /public/assets/fonts/Material-Design-Icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/Material-Design-Icons.ttf -------------------------------------------------------------------------------- /public/assets/fonts/Material-Design-Icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/Material-Design-Icons.woff -------------------------------------------------------------------------------- /public/assets/fonts/RobotoDraftBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/RobotoDraftBold.woff -------------------------------------------------------------------------------- /public/assets/fonts/RobotoDraftBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/RobotoDraftBold.woff2 -------------------------------------------------------------------------------- /public/assets/fonts/RobotoDraftItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/RobotoDraftItalic.woff -------------------------------------------------------------------------------- /public/assets/fonts/RobotoDraftItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/RobotoDraftItalic.woff2 -------------------------------------------------------------------------------- /public/assets/fonts/RobotoDraftMedium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/RobotoDraftMedium.woff -------------------------------------------------------------------------------- /public/assets/fonts/RobotoDraftMedium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/RobotoDraftMedium.woff2 -------------------------------------------------------------------------------- /public/assets/fonts/RobotoDraftRegular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/RobotoDraftRegular.woff -------------------------------------------------------------------------------- /public/assets/fonts/RobotoDraftRegular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/RobotoDraftRegular.woff2 -------------------------------------------------------------------------------- /public/assets/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /public/assets/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /public/assets/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /public/assets/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /public/assets/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /public/assets/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /public/assets/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/assets/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /public/assets/svg-loaders/audio.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 11 | 15 | 16 | 17 | 21 | 22 | 23 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /public/assets/svg-loaders/ball-triangle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 17 | 18 | 19 | 25 | 31 | 32 | 33 | 38 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /public/assets/svg-loaders/bars.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 12 | 13 | 17 | 21 | 22 | 23 | 27 | 31 | 32 | 33 | 37 | 41 | 42 | 43 | 47 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /public/assets/svg-loaders/circles.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 12 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /public/assets/svg-loaders/grid.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 13 | 14 | 15 | 19 | 20 | 21 | 25 | 26 | 27 | 31 | 32 | 33 | 37 | 38 | 39 | 43 | 44 | 45 | 49 | 50 | 51 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /public/assets/svg-loaders/hearts.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /public/assets/svg-loaders/oval.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /public/assets/svg-loaders/puff.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 12 | 19 | 20 | 21 | 28 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /public/assets/svg-loaders/rings.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 14 | 18 | 19 | 20 | 25 | 29 | 33 | 34 | 35 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /public/assets/svg-loaders/spinning-circles.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 11 | 12 | 16 | 17 | 18 | 22 | 23 | 24 | 28 | 29 | 30 | 34 | 35 | 36 | 40 | 41 | 42 | 46 | 47 | 48 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /public/assets/svg-loaders/tail-spin.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 20 | 21 | 22 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /public/assets/svg-loaders/three-dots.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 12 | 13 | 14 | 18 | 22 | 23 | 24 | 28 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /public/css/app.css: -------------------------------------------------------------------------------- 1 | .no-padding { 2 | padding: 0; 3 | } 4 | .no-padding-top { 5 | padding-top: 0; 6 | } 7 | .no-margin-top { 8 | margin-top: 0; 9 | } 10 | .no-margin { 11 | margin: 0 !important; 12 | } 13 | #snackbar-container { 14 | right: 20px; 15 | top: 20px; 16 | left: initial; 17 | bottom: initial; 18 | } 19 | .snackbar { 20 | background-color: #323232; 21 | color: rgba(255, 255, 255, 0.84); 22 | font-size: 14px; 23 | border-radius: 2px; 24 | box-shadow: 0 1px 6px 0 rgba(0, 0, 0, 0.12), 0 1px 6px 0 rgba(0, 0, 0, 0.12); 25 | height: 0; 26 | transition: -webkit-transform 0.2s ease-in-out, opacity 0.2s ease-in, height 0 linear 0.2s, padding 0 linear 0.2s, height 0 linear 0.2s; 27 | transition: transform 0.2s ease-in-out, opacity 0.2s ease-in, height 0 linear 0.2s, padding 0 linear 0.2s, height 0 linear 0.2s; 28 | -webkit-transform: translateY(200%); 29 | transform: translateY(200%); 30 | } 31 | .snackbar.snackbar-opened { 32 | opacity: 1; 33 | padding: 14px 15px; 34 | margin-bottom: 20px; 35 | height: auto; 36 | transition: -webkit-transform 0.2s ease-in-out, opacity 0.2s ease-in, height 0 linear 0.2s, height 0 linear 0.2s; 37 | transition: transform 0.2s ease-in-out, opacity 0.2s ease-in, height 0 linear 0.2s, height 0 linear 0.2s; 38 | -webkit-transform: none; 39 | transform: none; 40 | } 41 | .snackbar.toast { 42 | border-radius: 200px; 43 | } 44 | 45 | /*# sourceMappingURL=app.css.map */ -------------------------------------------------------------------------------- /public/css/app.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["custom.less","custom.css"],"names":[],"mappings":"AAEA;EACI,YAAA;ECDH;ADID;EACI,gBAAA;ECFH;ADKD;EACI,eAAA;ECHH;ADMD;EACI,sBAAA;ECJH;ADOD;EACE,aAAA;EACA,WAAA;EACA,eAAA;EACA,iBAAA;ECLD;ADQD;EACI,2BAAA;EACA,kCAAA;EACA,iBAAA;EACA,oBAAA;EACA,8EAAA;EACA,WAAA;EACA,yIAAA;EACA,iIAAA;EACA,qCAAA;EAEA,6BAAA;ECNH;ADSD;EAEI,YAAA;EACA,oBAAA;EACA,qBAAA;EACA,cAAA;EACA,kHAAA;EACA,0GAAA;EACA,yBAAA;EAEA,iBAAA;ECRH;ADWD;EACI,sBAAA;ECTH","file":"app.css","sourcesContent":["@import \"_colors.less\";\n \n.no-padding {\n padding: 0;\n}\n \n.no-padding-top {\n padding-top: 0;\n}\n \n.no-margin-top {\n margin-top: 0;\n}\n \n.no-margin {\n margin: 0 !important;\n}\n\n#snackbar-container {\n right: 20px;\n top: 20px;\n left: initial;\n bottom: initial;\n}\n\n.snackbar {\n background-color: #323232;\n color: rgba(255,255,255,.84);\n font-size: 14px;\n border-radius: 2px;\n box-shadow: 0 1px 6px 0 rgba(0,0,0,.12),0 1px 6px 0 rgba(0,0,0,.12);\n height: 0;\n transition: -webkit-transform .2s ease-in-out,opacity .2s ease-in,height 0 linear .2s,padding 0 linear .2s,height 0 linear .2s;\n transition: transform .2s ease-in-out,opacity .2s ease-in,height 0 linear .2s,padding 0 linear .2s,height 0 linear .2s;\n -webkit-transform: translateY(200%);\n -ms-transform: translateY(200%);\n transform: translateY(200%);\n}\n\n.snackbar.snackbar-opened {\n height: auto;\n opacity: 1;\n padding: 14px 15px;\n margin-bottom: 20px;\n height: auto;\n transition: -webkit-transform .2s ease-in-out,opacity .2s ease-in,height 0 linear .2s,height 0 linear .2s;\n transition: transform .2s ease-in-out,opacity .2s ease-in,height 0 linear .2s,height 0 linear .2s;\n -webkit-transform: none;\n -ms-transform: none;\n transform: none;\n}\n\n.snackbar.toast {\n border-radius: 200px;\n}",null],"sourceRoot":"/source/"} -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/public/favicon.ico -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | /* 11 | |-------------------------------------------------------------------------- 12 | | Register The Auto Loader 13 | |-------------------------------------------------------------------------- 14 | | 15 | | Composer provides a convenient, automatically generated class loader for 16 | | our application. We just need to utilize it! We'll simply require it 17 | | into the script here so that we don't have to worry about manual 18 | | loading any of our classes later on. It feels nice to relax. 19 | | 20 | */ 21 | 22 | require __DIR__.'/../bootstrap/autoload.php'; 23 | 24 | /* 25 | |-------------------------------------------------------------------------- 26 | | Turn On The Lights 27 | |-------------------------------------------------------------------------- 28 | | 29 | | We need to illuminate PHP development, so let us turn on the lights. 30 | | This bootstraps the framework and gets it ready for use, then it 31 | | will load up this application so that we can run it and send 32 | | the responses back to the browser and delight our users. 33 | | 34 | */ 35 | 36 | $app = require_once __DIR__.'/../bootstrap/app.php'; 37 | 38 | /* 39 | |-------------------------------------------------------------------------- 40 | | Run The Application 41 | |-------------------------------------------------------------------------- 42 | | 43 | | Once we have the application, we can handle the incoming request 44 | | through the kernel, and send the associated response back to 45 | | the client's browser allowing them to enjoy the creative 46 | | and wonderful application we have prepared for them. 47 | | 48 | */ 49 | 50 | $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); 51 | 52 | $response = $kernel->handle( 53 | $request = Illuminate\Http\Request::capture() 54 | ); 55 | 56 | $response->send(); 57 | 58 | $kernel->terminate($request, $response); 59 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | ## Laravel + Vue.js Basic Boilerplate 2 | 3 | I created this repository in an attempt to create a basic boilerplate for a simple dashboard using Laravel + Vue.js and of course to help me understand and practice Vue.js. 4 | 5 | This is the first time I am using Vue, and is also the first time I create a repository on Github, suggestions are most welcome, and I hope to count on your collaboration. 6 | 7 | ### Installation 8 | 9 | ```sh 10 | $ git clone https://github.com/kuroski/Laravel-Vue-Boilerplate.git 11 | $ cd Laravel-Vue-Boilerplate 12 | $ cp .env.example .env 13 | $ composer update 14 | $ php artisan key:generate 15 | $ touch storage/database.sqlite 16 | $ [sudo] npm install 17 | $ bower install (if not work use "sudo bower install --allow-root") 18 | $ php artisan migrate 19 | $ php artisan db:seed 20 | $ gulp 21 | $ php artisan serve 22 | ``` 23 | 24 | **Or use Homestead xD** 25 | 26 | Login: john@doe.com 27 | Password: secret 28 | 29 | ### Introduction 30 | 31 | Everything was done the way to use the Vue as quickly as possible, so I'm using sqlite and php artisan serve to speed up. 32 | 33 | An extension was installed for the elixir browserify in order to use the **Vueify:** 34 | 35 | > Browserify transform for single-file Vue components 36 | 37 | 1. In **./gulpfile.js** I'm just compressing all the necessary assets and I am using the extension of browserify to transform our **./resources/assets/js/main.js** script. 38 | 39 | 2. In the **./app/Http/routes.php** file we just have the login and logout basic routes, and our root. 40 | 41 | 3. On **./resources/views/home.blade.php** whe have our master view, I am importing all the assets and putting the application root node ```
``` 42 | 43 | 4. All the Vue stuff is in the **./resources/assets/js** folder. 44 | 45 | ### Vue Stuff 46 | 47 | I'm using the vue-resource package for requests to the backend. 48 | And I'm using the director for routes. 49 | 50 | ``` 51 | // main.js 52 | 53 | var Vue = require('vue') 54 | 55 | // Import vue-resource and configure to use the csrf token in all requests, in which I put him in a meta tag in home.blade.php 56 | var Resource = require('vue-resource') 57 | Vue.use(Resource) 58 | Vue.http.headers.common['X-CSRF-TOKEN'] = document.querySelector('#token').getAttribute('value'); 59 | 60 | // Define our routes 61 | var Router = require('director').Router 62 | var app = new Vue(require('./app.vue')) 63 | var router = new Router() 64 | 65 | router.on('login', function (page) { 66 | window.scrollTo(0, 0) 67 | app.view = 'login-view' 68 | }) 69 | 70 | router.on('dashboard', function (page) { 71 | window.scrollTo(0, 0) 72 | app.view = 'dashboard-view' 73 | }) 74 | 75 | router.configure({ 76 | notfound: function () { 77 | router.setRoute('dashboard') 78 | }, 79 | 80 | after: function() { 81 | // Check if the user is logged for each request 82 | var route = window.location.hash.slice(2) 83 | 84 | if (route != 'login' && !app.isLoggedIn) 85 | window.location = "#/login" 86 | } 87 | }) 88 | 89 | router.init('login') 90 | ``` 91 | 92 | **storage.js** is just a helper to save localStorage variables 93 | 94 | ``` 95 | // app.vue 96 | ``` 97 | 98 | ### Todo's 99 | 100 | - [x] Finish all the basic structure (Basic routes + Main view + Gulp + Bower + Basic dashboard layout) 101 | - [x] Create the basic login system 102 | - [x] Logging out 103 | - [x] Fade transition between components 104 | - [x] Create a page load indicator 105 | - [ ] Finish Readme 106 | - [ ] Create a session on the dashboard for managing users 107 | - [ ] Check the application security 108 | - [ ] Make load indicator animation 109 | - [ ] Learn how to use TDD with Vue 110 | - [ ] Improve the backend (The way it is now is faster to do, so then I have to improve everything) 111 | - [ ] Optimize all 112 | - [ ] **Build a branch or a new repo of this dashboard using API + token authentication (jwt-auth)** 113 | 114 | ### References 115 | 116 | [FezVrasta/bootstrap-material-design] - Material design theme for Bootstrap 3 117 | 118 | [IronSummitMedia/startbootstrap-sb-admin-2] - A free, open source, Bootstrap admin theme created by Start Bootstrap 119 | 120 | [vuejs/vue-resource] - Resource component for Vue.js 121 | 122 | [vuejs/vueify] - Browserify transform for single-file Vue components 123 | 124 | [vuejs/vue-hackernews] - HackerNews clone with Vue.js 125 | 126 | [flatiron/director] - A tiny and isomorphic URL router for JavaScript 127 | 128 | [skrajewski/laravel-elixir-browserify] - Laravel Elixir Browserify Extension 129 | 130 | [The Vast World of Vue.js] - **Laracasts Serie =DD** 131 | 132 | [Vue.js] - Vue.js official website / documentation / api 133 | 134 | [Laravel] - Laravel official website / documentation / api 135 | 136 | [FezVrasta/snackbarjs] - Create Material Design snackbars and toasts with ease. 137 | 138 | [jashkenas/underscore] - JavaScript's utility _ belt 139 | 140 | License 141 | ---- 142 | 143 | MIT 144 | 145 | [FezVrasta/bootstrap-material-design]:https://github.com/FezVrasta/bootstrap-material-design 146 | [IronSummitMedia/startbootstrap-sb-admin-2]:https://github.com/IronSummitMedia/startbootstrap-sb-admin-2 147 | [vuejs/vue-resource]:https://github.com/vuejs/vue-resource 148 | [vuejs/vueify]:https://github.com/vuejs/vueify 149 | [vuejs/vue-hackernews]:https://github.com/vuejs/vue-hackernews 150 | [flatiron/director]:https://github.com/flatiron/director 151 | [skrajewski/laravel-elixir-browserify]:https://github.com/skrajewski/laravel-elixir-browserify 152 | [The Vast World of Vue.js]:https://laracasts.com/series/learning-vuejs 153 | [Vue.js]:http://vuejs.org/ 154 | [Laravel]:http://laravel.com/docs/5.1 155 | [FezVrasta/snackbarjs]:https://github.com/FezVrasta/snackbarjs 156 | [jashkenas/underscore]:https://github.com/jashkenas/underscore 157 | -------------------------------------------------------------------------------- /resources/assets/js/app.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 30 | 31 | -------------------------------------------------------------------------------- /resources/assets/js/components/loader.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /resources/assets/js/components/sidebar.vue: -------------------------------------------------------------------------------- 1 | 3 | 4 | 68 | 69 | -------------------------------------------------------------------------------- /resources/assets/js/main.js: -------------------------------------------------------------------------------- 1 | var Vue = require('vue') 2 | 3 | /** 4 | * Resource default configurations 5 | */ 6 | 7 | var Resource = require('vue-resource') 8 | Vue.use(Resource) 9 | Vue.http.headers.common['X-CSRF-TOKEN'] = document.querySelector('#token').getAttribute('value'); 10 | Vue.http.options.beforeSend = function() { 11 | app.$broadcast('loading:show') 12 | 13 | setTimeout(function(){ app.$broadcast('loading:hide') }, 2000); 14 | } 15 | 16 | /** 17 | * Routes 18 | */ 19 | 20 | var Router = require('director').Router 21 | var app = new Vue(require('./app.vue')) 22 | var router = new Router() 23 | 24 | router.on('login', function (page) { 25 | window.scrollTo(0, 0) 26 | app.view = 'login-view' 27 | }) 28 | 29 | router.on('dashboard', function (page) { 30 | window.scrollTo(0, 0) 31 | app.view = 'dashboard-view' 32 | }) 33 | 34 | router.on('users', function (page) { 35 | window.scrollTo(0, 0) 36 | app.view = 'user-view' 37 | }) 38 | 39 | router.configure({ 40 | notfound: function () { 41 | router.setRoute('dashboard') 42 | }, 43 | 44 | after: function() { 45 | var route = window.location.hash.slice(2) 46 | 47 | if (route != 'login' && !app.isLoggedIn) 48 | window.location = "#/login" 49 | } 50 | }) 51 | 52 | router.init('login') 53 | -------------------------------------------------------------------------------- /resources/assets/js/storage.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | fetchArray: function(key){ 3 | if(localStorage.getItem(key)){ 4 | return JSON.parse(localStorage.getItem(key)); 5 | } 6 | 7 | return []; 8 | }, 9 | 10 | saveArray: function(key, value){ 11 | localStorage.setItem(key, JSON.stringify(value)); 12 | } 13 | } -------------------------------------------------------------------------------- /resources/assets/js/views/dashboard-view.vue: -------------------------------------------------------------------------------- 1 | 3 | 4 | 19 | 20 | -------------------------------------------------------------------------------- /resources/assets/js/views/login-view.vue: -------------------------------------------------------------------------------- 1 | 3 | 4 | 34 | 35 | -------------------------------------------------------------------------------- /resources/assets/js/views/user-view.vue: -------------------------------------------------------------------------------- 1 | 3 | 4 | 25 | 26 | -------------------------------------------------------------------------------- /resources/assets/less/_colors.less: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/resources/assets/less/_colors.less -------------------------------------------------------------------------------- /resources/assets/less/custom.less: -------------------------------------------------------------------------------- 1 | @import "_colors.less"; 2 | 3 | .no-padding { 4 | padding: 0; 5 | } 6 | 7 | .no-padding-top { 8 | padding-top: 0; 9 | } 10 | 11 | .no-margin-top { 12 | margin-top: 0; 13 | } 14 | 15 | .no-margin { 16 | margin: 0 !important; 17 | } 18 | 19 | #snackbar-container { 20 | right: 20px; 21 | top: 20px; 22 | left: initial; 23 | bottom: initial; 24 | } 25 | 26 | .snackbar { 27 | background-color: #323232; 28 | color: rgba(255,255,255,.84); 29 | font-size: 14px; 30 | border-radius: 2px; 31 | box-shadow: 0 1px 6px 0 rgba(0,0,0,.12),0 1px 6px 0 rgba(0,0,0,.12); 32 | height: 0; 33 | transition: -webkit-transform .2s ease-in-out,opacity .2s ease-in,height 0 linear .2s,padding 0 linear .2s,height 0 linear .2s; 34 | transition: transform .2s ease-in-out,opacity .2s ease-in,height 0 linear .2s,padding 0 linear .2s,height 0 linear .2s; 35 | -webkit-transform: translateY(200%); 36 | -ms-transform: translateY(200%); 37 | transform: translateY(200%); 38 | } 39 | 40 | .snackbar.snackbar-opened { 41 | height: auto; 42 | opacity: 1; 43 | padding: 14px 15px; 44 | margin-bottom: 20px; 45 | height: auto; 46 | transition: -webkit-transform .2s ease-in-out,opacity .2s ease-in,height 0 linear .2s,height 0 linear .2s; 47 | transition: transform .2s ease-in-out,opacity .2s ease-in,height 0 linear .2s,height 0 linear .2s; 48 | -webkit-transform: none; 49 | -ms-transform: none; 50 | transform: none; 51 | } 52 | 53 | .snackbar.toast { 54 | border-radius: 200px; 55 | } -------------------------------------------------------------------------------- /resources/assets/less/material/_alerts.less: -------------------------------------------------------------------------------- 1 | .alert { 2 | border: 0px; 3 | border-radius: 0; 4 | 5 | .generic-variations(~"", @darkbg-text, { 6 | background-color: @material-color; 7 | color: @text-color; 8 | 9 | a, .alert-link { 10 | color: @text-color; 11 | } 12 | }); 13 | 14 | &-info, &-danger, &-warning, &-success { 15 | color: @darkbg-text; 16 | } 17 | 18 | &-default { 19 | a, .alert-link { 20 | color: @lightbg-text; 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /resources/assets/less/material/_buttons.less: -------------------------------------------------------------------------------- 1 | .btn { 2 | position: relative; 3 | padding: 8px 30px; 4 | border: 0; 5 | margin: 10px 1px; 6 | cursor: pointer; 7 | border-radius: 2px; 8 | text-transform: uppercase; 9 | text-decoration: none; 10 | color: @darkbg-text; 11 | 12 | &:hover:not(.btn-link):not(.btn-flat):not(.btn-fab) { 13 | .shadow-z-1(); 14 | } 15 | &:active:not(.btn-link):not(.btn-flat):not(.btn-fab) { 16 | .shadow-z-1-hover(); 17 | } 18 | transition: background-color 0.2s ease, box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1); 19 | outline: none !important; 20 | 21 | 22 | .variations(~".btn-flat:not(.btn-link)", color, @lightbg-text); 23 | 24 | .background-variations(~":not(.btn-link):not(.btn-flat)", @btn-default); 25 | 26 | // BTN hover effect 27 | .generic-variations(~":hover:not(.btn-link):not(.btn-flat)", @btn-default, { 28 | background-color: contrast(@material-color, darken(@material-color, 4%), lighten(@material-color, 4%), @contrast-factor); 29 | }); 30 | // BTN active effect 31 | .generic-variations(~":active:not(.btn-link):not(.btn-flat)", @btn-default, { 32 | background-color: contrast(@material-color, darken(@material-color, 6%), lighten(@material-color, 6%), @contrast-factor); 33 | }); 34 | // BTN .active effect 35 | .generic-variations(~".active:not(.btn-link):not(.btn-flat)", @btn-default, { 36 | background-color: contrast(@material-color, darken(@material-color, 6%), lighten(@material-color, 6%), @contrast-factor); 37 | }); 38 | // BTN flat hover effect 39 | .generic-variations(~".btn-flat:hover:not(.btn-ink)", @btn-default, { 40 | background-color: fade(@material-color, 20%); 41 | }); 42 | 43 | } 44 | 45 | .btn { 46 | &.btn-flat { 47 | background: none; 48 | box-shadow: none; 49 | font-weight: 500; 50 | &:disabled { 51 | color: @text-disabled !important; 52 | } 53 | } 54 | 55 | // Size variations 56 | &.btn-sm { 57 | padding: 5px 20px; 58 | } 59 | &.btn-xs { 60 | padding: 4px 15px; 61 | font-size: 10px; 62 | } 63 | 64 | &.btn-raised { 65 | .btn-shadow(); 66 | } 67 | 68 | &.btn-fab { 69 | margin: 0; 70 | padding: 15px; 71 | font-size: 26px; 72 | width: 56px; 73 | height: 56px; 74 | &, &:hover, &:active { 75 | .variations(~"", background-color, transparent); 76 | } 77 | &, &:hover { 78 | .shadow-z-1(); 79 | } 80 | &:active { 81 | .shadow-z-1-hover(); 82 | } 83 | &, .ripple-wrapper { 84 | border-radius: 100%; 85 | } 86 | &.btn-fab-mini { 87 | width: 40px; 88 | height: 40px; 89 | padding: 13px; 90 | font-size: 15px; 91 | } 92 | i { 93 | position: relative; 94 | top: -5px; 95 | } 96 | } 97 | } 98 | 99 | // This is needed to style buttons which has not a variation suffix (they must be stiled as btn-default) 100 | .btn-link, .btn:not([class*="btn-"]), .btn-default { 101 | color: @lightbg-text; 102 | &:hover { 103 | color: @lightbg-text; 104 | } 105 | } 106 | .btn:not([class*="btn-"]), .btn-default, .btn-flat:not(.btn-link) { 107 | &:hover, &.active { 108 | background-color: rgba(255,255,255,0.5); 109 | } 110 | } 111 | .open > .dropdown-toggle.btn { 112 | .variations(~"", background-color, @btn-default); 113 | } 114 | .btn-group .btn+.btn, .btn-group .btn+.btn-group, .btn-group .btn-group+.btn, .btn-group .btn-group+.btn-group { 115 | margin-left: 0; 116 | } 117 | .btn-group, .btn-group-vertical { 118 | position: relative; 119 | border-radius: 2px; 120 | margin: 10px 1px; 121 | 122 | .btn-shadow(); 123 | &.open .dropdown-toggle { 124 | box-shadow: none; 125 | } 126 | &.btn-group-raised { 127 | .btn-shadow(); 128 | } 129 | .btn, .btn:active, .btn-group { 130 | box-shadow: none !important; 131 | margin: 0; 132 | } 133 | } 134 | .btn-group-flat { 135 | box-shadow: none !important; 136 | } 137 | 138 | .btn-shadow() { 139 | .shadow-z-1(); 140 | transition: box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1); 141 | &:active:not(.btn-link) { 142 | .shadow-z-1-hover(); 143 | } 144 | } 145 | -------------------------------------------------------------------------------- /resources/assets/less/material/_cards.less: -------------------------------------------------------------------------------- 1 | .card { 2 | 3 | /***** Make height equal to width (http://stackoverflow.com/a/6615994) ****/ 4 | 5 | display: inline-block; 6 | position: relative; 7 | width: 100%; 8 | .card-height-indicator { 9 | margin-top: 100%; 10 | } 11 | .card-content { 12 | position: absolute; 13 | top: 0; 14 | bottom: 0; 15 | left: 0; 16 | right: 0; 17 | } 18 | 19 | /**************************************************************************/ 20 | 21 | 22 | border-radius: 2px; 23 | color: @card-body-text; 24 | background: @card-body-background; 25 | 26 | .shadow-z-2(); 27 | 28 | .card-image { 29 | height: 60%; 30 | position: relative; 31 | overflow: hidden; 32 | img { 33 | width: 100%; 34 | height: 100%; 35 | border-top-left-radius: 2px; 36 | border-top-right-radius: 2px; 37 | pointer-events: none; 38 | } 39 | .card-image-headline { 40 | position: absolute; 41 | bottom: 16px; 42 | left: 18px; 43 | color: @card-image-headline; 44 | font-size: 2em; 45 | } 46 | } 47 | 48 | .card-body { 49 | height: 30%; 50 | padding: 18px; 51 | } 52 | 53 | .card-footer { 54 | height: 10%; 55 | padding: 18px; 56 | button { 57 | margin: 0 !important; 58 | position: relative; 59 | bottom: 25px; 60 | width: auto; 61 | &:first-child { 62 | left: -15px; 63 | } 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /resources/assets/less/material/_checkboxes.less: -------------------------------------------------------------------------------- 1 | .form-horizontal .checkbox { 2 | padding-top: 20px; 3 | } 4 | .checkbox { 5 | transform: translateZ(0); // Force 3d rendering 6 | label { 7 | cursor: pointer; 8 | padding-left: 0; // Reset for Bootstrap rule 9 | } 10 | 11 | // Hide native checkbox 12 | input[type=checkbox] { 13 | opacity: 0; 14 | position: absolute; 15 | margin: 0; 16 | z-index: -1; 17 | width: 0; 18 | height: 0; 19 | overflow: hidden; 20 | left: 0; 21 | pointer-events: none; 22 | } 23 | 24 | .checkbox-material { 25 | vertical-align: middle; 26 | position: relative; 27 | top: 3px; 28 | &:before { 29 | display: block; 30 | position: absolute; 31 | left: 0; 32 | content: ""; 33 | background-color: rgba(0,0,0,.84); 34 | height: @checkbox-size; 35 | width: @checkbox-size; 36 | border-radius: 100%; 37 | z-index: 1; 38 | opacity: 0; 39 | margin: 0; 40 | transform: scale3d(2.3, 2.3, 1); 41 | } 42 | 43 | .check { 44 | position: relative; 45 | display: inline-block; 46 | width: @checkbox-size; 47 | height: @checkbox-size; 48 | border: 2px solid; 49 | border-radius: 2px; 50 | overflow: hidden; 51 | z-index: 1; 52 | } 53 | .check:before { 54 | position: absolute; 55 | content: ""; 56 | transform: rotate(45deg); 57 | display: block; 58 | margin-top: -4px; 59 | margin-left: 6px; 60 | width: 0; 61 | height: 0; 62 | box-shadow: 63 | 0 0 0 0, 64 | 0 0 0 0, 65 | 0 0 0 0, 66 | 0 0 0 0, 67 | 0 0 0 0, 68 | 0 0 0 0, 69 | 0 0 0 0 inset; 70 | animation: checkbox-off @checkbox-animation-check forwards; 71 | } 72 | } 73 | 74 | input[type=checkbox]:focus + .checkbox-material .check:after { 75 | opacity: 0.2; 76 | } 77 | input[type=checkbox]:checked + .checkbox-material .check:before { 78 | box-shadow: 79 | 0 0 0 10px, 80 | 10px -10px 0 10px, 81 | 32px 0px 0 20px, 82 | 0px 32px 0 20px, 83 | -5px 5px 0 10px, 84 | 20px -12px 0 11px; 85 | animation: checkbox-on @checkbox-animation-check forwards; 86 | } 87 | 88 | input[type=checkbox]:not(:checked) + .checkbox-material:before { 89 | animation: rippleOff @checkbox-animation-ripple; 90 | } 91 | input[type=checkbox]:checked + .checkbox-material:before { 92 | animation: rippleOn @checkbox-animation-ripple; 93 | } 94 | 95 | // Ripple effect on click 96 | input[type=checkbox]:not(:checked) + .checkbox-material .check:after { 97 | animation: rippleOff @checkbox-animation-ripple forwards; 98 | } 99 | input[type=checkbox]:checked + .checkbox-material .check:after { 100 | animation: rippleOn @checkbox-animation-ripple forwards; 101 | } 102 | 103 | // Style for disabled inputs 104 | input[type=checkbox][disabled]:not(:checked) ~ .checkbox-material .check:before, 105 | input[type=checkbox][disabled] + .circle { 106 | opacity: 0.5; 107 | } 108 | input[type=checkbox][disabled] + .checkbox-material .check:after { 109 | background-color: @lightbg-text; 110 | transform: rotate(-45deg); 111 | } 112 | 113 | .variations(~" input[type=checkbox]:checked + .checkbox-material .check:after", background-color, @success); 114 | .variations(~" input[type=checkbox]:checked + .checkbox-material .check:before", color, #4caf50); 115 | .variations(~" input[type=checkbox]:checked + .checkbox-material .check", color, #4caf50); 116 | } 117 | 118 | 119 | @keyframes checkbox-on { 120 | 0% { 121 | box-shadow: 122 | 0 0 0 10px, 123 | 10px -10px 0 10px, 124 | 32px 0px 0 20px, 125 | 0px 32px 0 20px, 126 | -5px 5px 0 10px, 127 | 15px 2px 0 11px; 128 | } 129 | 50% { 130 | box-shadow: 131 | 0 0 0 10px, 132 | 10px -10px 0 10px, 133 | 32px 0px 0 20px, 134 | 0px 32px 0 20px, 135 | -5px 5px 0 10px, 136 | 20px 2px 0 11px; 137 | } 138 | 100% { 139 | box-shadow: 140 | 0 0 0 10px, 141 | 10px -10px 0 10px, 142 | 32px 0px 0 20px, 143 | 0px 32px 0 20px, 144 | -5px 5px 0 10px, 145 | 20px -12px 0 11px; 146 | } 147 | } 148 | @keyframes checkbox-off { 149 | 0% { 150 | box-shadow: 151 | 0 0 0 10px, 152 | 10px -10px 0 10px, 153 | 32px 0px 0 20px, 154 | 0px 32px 0 20px, 155 | -5px 5px 0 10px, 156 | 20px -12px 0 11px, 157 | 0 0 0 0 inset; 158 | } 159 | 160 | 25% { 161 | box-shadow: 162 | 0 0 0 10px, 163 | 10px -10px 0 10px, 164 | 32px 0px 0 20px, 165 | 0px 32px 0 20px, 166 | -5px 5px 0 10px, 167 | 20px -12px 0 11px, 168 | 0 0 0 0 inset; 169 | } 170 | 50% { 171 | transform: rotate(45deg); 172 | margin-top: -4px; 173 | margin-left: 6px; 174 | width: 0px; 175 | height: 0px; 176 | box-shadow: 177 | 0 0 0 10px, 178 | 10px -10px 0 10px, 179 | 32px 0px 0 20px, 180 | 0px 32px 0 20px, 181 | -5px 5px 0 10px, 182 | 15px 2px 0 11px, 183 | 0 0 0 0 inset; 184 | } 185 | 51% { 186 | transform: rotate(0deg); 187 | margin-top: -2px; 188 | margin-left: -2px; 189 | width: 20px; 190 | height: 20px; 191 | box-shadow: 192 | 0 0 0 0, 193 | 0 0 0 0, 194 | 0 0 0 0, 195 | 0 0 0 0, 196 | 0 0 0 0, 197 | 0 0 0 0, 198 | 0px 0px 0 10px inset; 199 | } 200 | 100% { 201 | transform: rotate(0deg); 202 | margin-top: -2px; 203 | margin-left: -2px; 204 | width: 20px; 205 | height: 20px; 206 | box-shadow: 207 | 0 0 0 0, 208 | 0 0 0 0, 209 | 0 0 0 0, 210 | 0 0 0 0, 211 | 0 0 0 0, 212 | 0 0 0 0, 213 | 0px 0px 0 0px inset; 214 | } 215 | } 216 | @keyframes rippleOn { 217 | 0% { 218 | opacity: 0; 219 | } 220 | 50% { 221 | opacity: 0.2; 222 | } 223 | 100% { 224 | opacity: 0; 225 | } 226 | } 227 | @keyframes rippleOff { 228 | 0% { 229 | opacity: 0; 230 | } 231 | 50% { 232 | opacity: 0.2; 233 | } 234 | 100% { 235 | opacity: 0; 236 | } 237 | } 238 | -------------------------------------------------------------------------------- /resources/assets/less/material/_dialogs.less: -------------------------------------------------------------------------------- 1 | // 2 | // Modals 3 | // Material Design element Dialogs 4 | // -------------------------------------------------- 5 | .modal-content { 6 | .shadow-z-5(); 7 | border-radius: 2px; 8 | border: none; 9 | // Modal header 10 | // Top section of the modal w/ title and dismiss 11 | .modal-header { 12 | border-bottom: none; 13 | padding-top: 24px; 14 | padding-right: 24px; 15 | padding-bottom: 0px; 16 | padding-left: 24px; 17 | } 18 | // Modal body 19 | // Where all modal content resides (sibling of .modal-header and .modal-footer) 20 | .modal-body { 21 | padding-top: 0px; 22 | padding-right: 24px; 23 | padding-bottom: 16px; 24 | padding-left: 24px; 25 | } 26 | // Footer (for actions) 27 | .modal-footer { 28 | border-top: none; 29 | padding: 7px; 30 | button { 31 | margin: 0; 32 | padding-left: 16px; 33 | padding-right: 16px; 34 | width: auto; 35 | &.pull-left { 36 | padding-left: 5px; 37 | padding-right: 5px; 38 | position: relative; 39 | left: -5px; 40 | } 41 | } 42 | button+button { 43 | margin-bottom: 16px; 44 | } 45 | } 46 | .modal-body + .modal-footer { 47 | padding-top: 0; 48 | } 49 | } 50 | .modal-backdrop { 51 | background: rgba(0,0,0,0.3); 52 | } 53 | -------------------------------------------------------------------------------- /resources/assets/less/material/_dividers.less: -------------------------------------------------------------------------------- 1 | hr { 2 | &.on-dark { 3 | color: lighten(@black, 10%); 4 | } 5 | 6 | &.on-light { 7 | color: lighten(@white, 10%); 8 | } 9 | 10 | @media (-webkit-min-device-pixel-ratio: 0.75), 11 | (min--moz-device-pixel-ratio: 0.75), 12 | (-o-device-pixel-ratio: 3/4), 13 | (min-device-pixel-ratio: 0.75), 14 | (min-resolution: 0.75dppx), 15 | (min-resolution: 120dpi), { 16 | height:0.75px; 17 | } 18 | 19 | @media (-webkit-min-device-pixel-ratio: 1), 20 | (min--moz-device-pixel-ratio: 1), 21 | (-o-device-pixel-ratio: 1), 22 | (min-device-pixel-ratio: 1), 23 | (min-resolution: 1dppx), 24 | (min-resolution: 160dpi) { 25 | height:1px; 26 | } 27 | @media (-webkit-min-device-pixel-ratio: 1.33), 28 | (min--moz-device-pixel-ratio: 1.33), 29 | (-o-device-pixel-ratio: 133/100), 30 | (min-device-pixel-ratio: 1.33), 31 | (min-resolution: 1.33dppx), 32 | (min-resolution: 213dpi) { 33 | height:1.333px; 34 | } 35 | @media (-webkit-min-device-pixel-ratio: 1.5), 36 | (min--moz-device-pixel-ratio: 1.5), 37 | (-o-device-pixel-ratio: 3/2), 38 | (min-device-pixel-ratio: 1.5), 39 | (min-resolution: 1.5dppx), 40 | (min-resolution: 240dpi) { 41 | height:1.5px; 42 | } 43 | 44 | @media (-webkit-min-device-pixel-ratio: 2), 45 | (min--moz-device-pixel-ratio: 2), 46 | (-o-device-pixel-ratio: 2/1), 47 | (min-device-pixel-ratio: 2), 48 | (min-resolution: 2dppx), 49 | (min-resolution: 380dpi) { 50 | height:2px; 51 | } 52 | 53 | @media (-webkit-min-device-pixel-ratio: 3), 54 | (min--moz-device-pixel-ratio: 3), 55 | (-o-device-pixel-ratio: 3/1), 56 | (min-device-pixel-ratio: 3), 57 | (min-resolution: 3dppx), 58 | (min-resolution: 480dpi) { 59 | height:3px; 60 | } 61 | 62 | @media (-webkit-min-device-pixel-ratio: 4), 63 | (min--moz-device-pixel-ratio: 4), 64 | (-o-device-pixel-ratio: 4/1), 65 | (min-device-pixel-ratio: 3), 66 | (min-resolution: 4dppx), 67 | (min-resolution: 640dpi) { 68 | height:4px; 69 | } 70 | 71 | } 72 | -------------------------------------------------------------------------------- /resources/assets/less/material/_icons.less: -------------------------------------------------------------------------------- 1 | .mdi, icon { 2 | .variations(~"", color, @lightbg-text); 3 | line-height: inherit; 4 | vertical-align: bottom; 5 | } 6 | -------------------------------------------------------------------------------- /resources/assets/less/material/_inputs.less: -------------------------------------------------------------------------------- 1 | fieldset[disabled] .form-control, .form-control-wrapper .form-control, .form-control { 2 | &, &:focus, &.focus { 3 | &:not(textarea) { 4 | height: 28px; 5 | } 6 | padding: 0; 7 | float: none; 8 | border: 0; 9 | box-shadow: none; 10 | border-radius: 0; 11 | &:disabled { 12 | border-style: dashed; 13 | border-bottom: 1px solid #757575; 14 | } 15 | } 16 | } 17 | 18 | select[multiple].form-control { 19 | &, &:focus, &.focus { 20 | height: 85px; 21 | } 22 | } 23 | 24 | .form-control { 25 | border: 0; 26 | background-image: linear-gradient(@primary, @primary), linear-gradient(@input-underline-color, @input-underline-color); 27 | background-size: 0 2px, 100% 1px; 28 | background-repeat: no-repeat; 29 | background-position: center bottom, center calc(~"100% - 1px"); 30 | background-color: transparent; 31 | background-color: rgba(0,0,0,0); 32 | } 33 | .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { 34 | background-color: transparent; 35 | background-color: rgba(0,0,0,0); 36 | } 37 | fieldset[disabled] .form-control:disabled, .form-control-wrapper .form-control:disabled, .form-control:disabled, fieldset[disabled] .form-control:focus:disabled, .form-control-wrapper .form-control:focus:disabled, .form-control:focus:disabled, fieldset[disabled] .form-control.focus:disabled, .form-control-wrapper .form-control.focus:disabled, .form-control.focus:disabled { 38 | border: 0; 39 | } 40 | 41 | .form-control:focus, .form-control.focus { 42 | outline: none; 43 | background-image: linear-gradient(@primary, @primary), linear-gradient(@input-underline-color, @input-underline-color); 44 | animation: input-highlight 0.5s forwards; 45 | box-shadow: none; 46 | background-size: 0 2px, 100% 1px; 47 | } 48 | 49 | 50 | .form-control-wrapper { 51 | position: relative; 52 | 53 | .floating-label { 54 | color: #7E7E7E; 55 | font-size: 14px; 56 | position: absolute; 57 | pointer-events: none; 58 | left: 0px; 59 | top: 5px; 60 | transition: 0.2s ease all; 61 | opacity: 0; 62 | } 63 | .form-control:focus ~ .floating-label, 64 | .form-control:not(.empty) ~ .floating-label { 65 | top: -10px; 66 | font-size: 10px; 67 | opacity: 1; 68 | } 69 | .form-control:focus ~ .floating-label { 70 | color: @primary; 71 | } 72 | .form-control:not(.empty):invalid ~ .floating-label, .form-control.focus:invalid ~ .floating-label { 73 | color: @input-danger; 74 | } 75 | .form-control:focus ~ .material-input:after, .form-control.focus ~ .material-input:after { 76 | background-color: @input-default; 77 | } 78 | .form-control:invalid { 79 | background-image: linear-gradient(@input-danger, @input-danger), linear-gradient(@input-underline-color, @input-underline-color); 80 | } 81 | .form-control.empty ~ .floating-label { 82 | opacity: 1; 83 | } 84 | textarea { resize: none; } 85 | textarea ~ .form-control-highlight { 86 | margin-top: -11px; 87 | } 88 | 89 | // Hints 90 | .hint { 91 | position: absolute; 92 | font-size: 80%; 93 | display: none; 94 | } 95 | .form-control:focus ~ .hint, .form-control.focus ~ .hint { 96 | display: block; 97 | } 98 | 99 | select ~ .material-input:after { 100 | display: none; 101 | } 102 | 103 | // Fix for OS X 104 | select { 105 | appearance: none; 106 | } 107 | 108 | } 109 | 110 | .form-group { 111 | &.has-warning { 112 | .form-control { 113 | box-shadow: none; 114 | } 115 | .material-input:focus, .form-control:focus, .form-control.focus { 116 | background-image: linear-gradient(@input-warning, @input-warning), linear-gradient(@input-underline-color, @input-underline-color); 117 | box-shadow: none; 118 | } 119 | .control-label, input.form-control:focus ~ .floating-label { 120 | color: @input-warning; 121 | } 122 | } 123 | &.has-error { 124 | .form-control { 125 | box-shadow: none; 126 | } 127 | .material-input:focus, .form-control:focus, .form-control.focus { 128 | background-image: linear-gradient(@input-danger, @input-danger), linear-gradient(@input-underline-color, @input-underline-color); 129 | box-shadow: none; 130 | } 131 | .control-label, input.form-control:focus ~ .floating-label { 132 | color: @input-danger; 133 | } 134 | } 135 | &.has-success { 136 | .form-control { 137 | box-shadow: none; 138 | } 139 | .material-input:focus, .form-control:focus, .form-control.focus { 140 | background-image: linear-gradient(@input-success, @input-success), linear-gradient(@input-underline-color, @input-underline-color); 141 | box-shadow: none; 142 | } 143 | .control-label, input.form-control:focus ~ .floating-label { 144 | color: @input-success; 145 | } 146 | } 147 | &.has-info { 148 | .form-control { 149 | box-shadow: none; 150 | } 151 | .material-input:focus, .form-control:focus, .form-control.focus { 152 | background-image: linear-gradient(@input-info, @input-info), linear-gradient(@input-underline-color, @input-underline-color); 153 | box-shadow: none; 154 | } 155 | .control-label, input.form-control:focus ~ .floating-label { 156 | color: @input-info; 157 | } 158 | } 159 | .generic-variations(~" .form-control:focus", @primary, { 160 | background-image: linear-gradient(@material-color, @material-color), linear-gradient(@input-underline-color, @input-underline-color); 161 | }); 162 | .generic-variations(~" .form-control.focus", @primary, { 163 | background-image: linear-gradient(@material-color, @material-color), linear-gradient(@input-underline-color, @input-underline-color); 164 | }); 165 | .variations(~" .control-label", color, @lightbg-text); 166 | .variations(~" input.form-control:focus ~ .floating-label", color, @input-default); 167 | 168 | } 169 | 170 | .input-group { 171 | .form-control-wrapper { 172 | .form-control { 173 | float: none; 174 | } 175 | margin-right: 5px; 176 | margin-left: 5px; 177 | } 178 | .input-group-addon { 179 | border: 0; 180 | background: transparent; 181 | } 182 | .input-group-btn .btn { 183 | border-radius: 4px; 184 | margin: 0; 185 | } 186 | } 187 | 188 | select.form-control { 189 | border: 0; 190 | box-shadow: none; 191 | border-radius: 0; 192 | &:focus, &.focus { 193 | box-shadow: none; 194 | border-color: #757575; 195 | } 196 | } 197 | 198 | @keyframes input-highlight { 199 | 0% { 200 | background-size: 0 2px, 100% 1px; 201 | } 202 | 203 | 100% { 204 | background-size: 100% 2px, 100% 1px; 205 | } 206 | } 207 | 208 | // Input files (kinda hack) 209 | .form-control-wrapper input[type=file] { 210 | opacity: 0; 211 | position: absolute; 212 | top: 0; 213 | right: 0; 214 | bottom: 0; 215 | left: 0; 216 | width: 100%; 217 | height: 100%; 218 | z-index: 100; 219 | } 220 | -------------------------------------------------------------------------------- /resources/assets/less/material/_labels.less: -------------------------------------------------------------------------------- 1 | .label { 2 | border-radius: 1px; 3 | .variations(~"", background-color, @grey); 4 | } 5 | -------------------------------------------------------------------------------- /resources/assets/less/material/_lists.less: -------------------------------------------------------------------------------- 1 | .list-group { 2 | border-radius: 0; 3 | .list-group-item { 4 | background-color: transparent; 5 | overflow: hidden; 6 | border: 0; 7 | border-radius: 0; 8 | padding: 0 16px; 9 | &.baseline { 10 | border-bottom: 1px solid #cecece; 11 | &:last-child { 12 | border-bottom: none; 13 | } 14 | } 15 | .row-picture, .row-action-primary { 16 | float: left; 17 | display: inline-block; 18 | padding-right: 16px; 19 | img, i, label { 20 | display: block; 21 | width: 56px; 22 | height: 56px; 23 | } 24 | img { 25 | background: rgba(0,0,0,0.1); 26 | padding: 1px; 27 | &.circle { 28 | border-radius: 100%; 29 | } 30 | } 31 | i { 32 | background: rgba(0,0,0,0.25); 33 | border-radius: 100%; 34 | text-align: center; 35 | line-height: 56px; 36 | font-size: 20px; 37 | color: white; 38 | } 39 | label { 40 | margin-left: 7px; 41 | margin-right: -7px; 42 | margin-top: 5px; 43 | margin-bottom: -5px; 44 | .checkbox-material { 45 | left: -10px; 46 | } 47 | } 48 | } 49 | .row-content { 50 | display: inline-block; 51 | width: ~"calc(100% - 92px)"; 52 | min-height: 66px; 53 | .action-secondary { 54 | position: absolute; 55 | right: 16px; 56 | top: 16px; 57 | i { 58 | font-size: 20px; 59 | color: rgba(0,0,0,0.25); 60 | cursor: pointer; 61 | } 62 | } 63 | .action-secondary ~ * { 64 | max-width: ~"calc(100% - 30px)"; 65 | } 66 | .least-content { 67 | position: absolute; 68 | right: 16px; 69 | top: 0px; 70 | color: rgba(0,0,0,0.54); 71 | font-size: 14px; 72 | } 73 | } 74 | .list-group-item-heading { 75 | color: rgba(0, 0, 0, 0.77); 76 | font-size: 20px; 77 | line-height: 29px; 78 | } 79 | } 80 | .list-group-item.active { 81 | &:hover, &:focus { 82 | background: rgba(0,0,0,.15); 83 | outline: 10px solid rgba(0,0,0,.15); 84 | } 85 | .list-group-item-heading, .list-group-item-text { 86 | color: @lightbg-text; 87 | } 88 | 89 | } 90 | .list-group-separator { 91 | clear: both; 92 | overflow: hidden; 93 | margin-top: 10px; 94 | margin-bottom: 10px; 95 | &:before { 96 | content: ""; 97 | width: ~"calc(100% - 90px)"; 98 | border-bottom: 1px solid rgba(0,0,0,0.1); 99 | float: right; 100 | } 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /resources/assets/less/material/_mixins-fullpalette.less: -------------------------------------------------------------------------------- 1 | // usage: .variations(~" .check", color, transparent); 2 | .variations(@extra, @property, @default) { 3 | .generic-variations(@extra, @default, { 4 | @{property}: @material-color; 5 | }); 6 | } 7 | 8 | .background-variations(@extra, @default) { 9 | .generic-variations(@extra, @default, { 10 | background-color: @material-color; 11 | color: @text-color; 12 | & when (@material-color = @btn-default) { 13 | color: @lightbg-text; 14 | } 15 | }); 16 | } 17 | 18 | .text-variations(@extra, @default) { 19 | .generic-variations(@extra, @default, { 20 | color: @material-color; 21 | }); 22 | } 23 | 24 | // 25 | // To use this mixin you should pass a function as final parameter to define 26 | // the style. In that definition you can use the following variables to define it. 27 | // 28 | // @material-color-name ---> "red", "green", "indigo" ... 29 | // @material-color-full-name ---> "red", "green-50", "indigo-400" ... 30 | // @material-color ---> #f44336, #e8f5e9, #5c6bc0 ... 31 | // @text-color ---> rgba(255,255,255,0.84), rgba(0,0,0,0.84), rgba(255,255,255,0.84) ... 32 | // 33 | 34 | .generic-variations(@extra, @default, @func) { 35 | 36 | @contrast-factor: 40%; 37 | 38 | // bootstrap styles 39 | &@{extra}, &-default@{extra} { 40 | @material-color-name: "default"; 41 | @material-color-full-name: @material-color-name; 42 | @material-color: @default; 43 | @text-color: @darkbg-text; 44 | @func(); 45 | } 46 | &-black@{extra} { 47 | @material-color-name: "black"; 48 | @material-color-full-name: @material-color-name; 49 | @material-color: @black; 50 | @text-color: @darkbg-text; 51 | @func(); 52 | } 53 | &-white@{extra} { 54 | @material-color-name: "white"; 55 | @material-color-full-name: @material-color-name; 56 | @material-color: @white; 57 | @text-color: @lightbg-text; 58 | @func(); 59 | } 60 | &-inverse@{extra} { 61 | @material-color-name: "inverse"; 62 | @material-color-full-name: @material-color-name; 63 | @material-color: @inverse; 64 | @text-color: contrast(@inverse, @lightbg-text, @darkbg-text, @contrast-factor); 65 | @func(); 66 | } 67 | &-primary@{extra} { 68 | @material-color-name: "primary"; 69 | @material-color-full-name: @material-color-name; 70 | @material-color: @primary; 71 | @text-color: @darkbg-text; 72 | @func(); 73 | } 74 | &-success@{extra} { 75 | @material-color-name: "success"; 76 | @material-color-full-name: @material-color-name; 77 | @material-color: @success; 78 | @text-color: @darkbg-text; 79 | @func(); 80 | } 81 | &-info@{extra} { 82 | @material-color-name: "info"; 83 | @material-color-full-name: @material-color-name; 84 | @material-color: @info; 85 | @text-color: @darkbg-text; 86 | @func(); 87 | } 88 | &-warning@{extra} { 89 | @material-color-name: "warning"; 90 | @material-color-full-name: @material-color-name; 91 | @material-color: @warning; 92 | @text-color: @darkbg-text; 93 | @func(); 94 | } 95 | &-danger@{extra} { 96 | @material-color-name: "danger"; 97 | @material-color-full-name: @material-color-name; 98 | @material-color: @danger; 99 | @text-color: @darkbg-text; 100 | @func(); 101 | } 102 | 103 | // given a color build multiples dephs 104 | .generic-variations-factory(@material-color-name) { 105 | 106 | // given a color and its deph build css 107 | .generic-variations-factory-deep(@material-color-number) { 108 | 109 | &-material-@{material-color-name}@{material-color-number}@{extra} { 110 | @material-color-full-name: "@{material-color-name}@{material-color-number}"; 111 | @material-color: @@material-color-full-name; 112 | @text-color: contrast(@material-color, @lightbg-text, @darkbg-text, @contrast-factor); 113 | @func(); 114 | } 115 | 116 | } 117 | 118 | .generic-variations-factory-deep(~""); 119 | .generic-variations-factory-deep(~"-50"); 120 | .generic-variations-factory-deep(~"-100"); 121 | .generic-variations-factory-deep(~"-200"); 122 | .generic-variations-factory-deep(~"-300"); 123 | .generic-variations-factory-deep(~"-400"); 124 | .generic-variations-factory-deep(~"-500"); 125 | .generic-variations-factory-deep(~"-600"); 126 | .generic-variations-factory-deep(~"-700"); 127 | .generic-variations-factory-deep(~"-800"); 128 | .generic-variations-factory-deep(~"-900"); 129 | .generic-variations-factory-deep(~"-A100"); 130 | .generic-variations-factory-deep(~"-A200"); 131 | .generic-variations-factory-deep(~"-A400"); 132 | .generic-variations-factory-deep(~"-A700"); 133 | } 134 | 135 | .generic-variations-factory(~"red"); 136 | .generic-variations-factory(~"pink"); 137 | .generic-variations-factory(~"purple"); 138 | .generic-variations-factory(~"deep-purple"); 139 | .generic-variations-factory(~"indigo"); 140 | .generic-variations-factory(~"blue"); 141 | .generic-variations-factory(~"light-blue"); 142 | .generic-variations-factory(~"cyan"); 143 | .generic-variations-factory(~"teal"); 144 | .generic-variations-factory(~"green"); 145 | .generic-variations-factory(~"light-green"); 146 | .generic-variations-factory(~"lime"); 147 | .generic-variations-factory(~"yellow"); 148 | .generic-variations-factory(~"amber"); 149 | .generic-variations-factory(~"orange"); 150 | .generic-variations-factory(~"deep-orange"); 151 | .generic-variations-factory(~"brown"); 152 | .generic-variations-factory(~"grey"); 153 | .generic-variations-factory(~"blue-grey"); 154 | 155 | } 156 | 157 | 158 | @all-variations: ~"-default, -primary, -info, -success, -warning, -danger"; 159 | -------------------------------------------------------------------------------- /resources/assets/less/material/_mixins.less: -------------------------------------------------------------------------------- 1 | // usage: .variations(~" .check", color, transparent); 2 | .variations(@extra, @property, @default) { 3 | .generic-variations(@extra, @default, { 4 | @{property}: @material-color; 5 | }); 6 | } 7 | 8 | .background-variations(@extra, @default) { 9 | .generic-variations(@extra, @default, { 10 | background-color: @material-color; 11 | color: @text-color; 12 | & when (@material-color = @btn-default) { 13 | color: @lightbg-text; 14 | } 15 | }); 16 | } 17 | 18 | .text-variations(@extra, @default) { 19 | .generic-variations(@extra, @default, { 20 | color: @material-color; 21 | }); 22 | } 23 | 24 | // 25 | // To use this mixin you should pass a function as final parameter to define 26 | // the style. In that definition you can use the following variables to define it. 27 | // 28 | // @material-color-name ---> "red", "green", "indigo" ... 29 | // @material-color-full-name ---> "red", "green-50", "indigo-400" ... 30 | // @material-color ---> #f44336, #e8f5e9, #5c6bc0 ... 31 | // @text-color ---> rgba(255,255,255,0.84), rgba(0,0,0,0.84), rgba(255,255,255,0.84) ... 32 | // 33 | 34 | 35 | .generic-variations(@extra, @default, @func) { 36 | 37 | @contrast-factor: 40%; 38 | 39 | // bootstrap styles 40 | &@{extra}, &-default@{extra} { 41 | @material-color-name: "default"; 42 | @material-color-full-name: @material-color-name; 43 | @material-color: @default; 44 | @text-color: @darkbg-text; 45 | @func(); 46 | } 47 | &-black@{extra} { 48 | @material-color-name: "black"; 49 | @material-color-full-name: @material-color-name; 50 | @material-color: @black; 51 | @text-color: @darkbg-text; 52 | @func(); 53 | } 54 | &-white@{extra} { 55 | @material-color-name: "white"; 56 | @material-color-full-name: @material-color-name; 57 | @material-color: @white; 58 | @text-color: @lightbg-text; 59 | @func(); 60 | } 61 | &-inverse@{extra} { 62 | @material-color-name: "inverse"; 63 | @material-color-full-name: @material-color-name; 64 | @material-color: @inverse; 65 | @text-color: contrast(@inverse, @lightbg-text, @darkbg-text, @contrast-factor); 66 | @func(); 67 | } 68 | &-primary@{extra} { 69 | @material-color-name: "primary"; 70 | @material-color-full-name: @material-color-name; 71 | @material-color: @primary; 72 | @text-color: @darkbg-text; 73 | @func(); 74 | } 75 | &-success@{extra} { 76 | @material-color-name: "success"; 77 | @material-color-full-name: @material-color-name; 78 | @material-color: @success; 79 | @text-color: @darkbg-text; 80 | @func(); 81 | } 82 | &-info@{extra} { 83 | @material-color-name: "info"; 84 | @material-color-full-name: @material-color-name; 85 | @material-color: @info; 86 | @text-color: @darkbg-text; 87 | @func(); 88 | } 89 | &-warning@{extra} { 90 | @material-color-name: "warning"; 91 | @material-color-full-name: @material-color-name; 92 | @material-color: @warning; 93 | @text-color: @darkbg-text; 94 | @func(); 95 | } 96 | &-danger@{extra} { 97 | @material-color-name: "danger"; 98 | @material-color-full-name: @material-color-name; 99 | @material-color: @danger; 100 | @text-color: @darkbg-text; 101 | @func(); 102 | } 103 | 104 | // given a color build multiples dephs 105 | .generic-variations-factory(@material-color-name) { 106 | 107 | // given a color and its deph build css 108 | .generic-variations-factory-deep(@material-color-number) { 109 | 110 | &-material-@{material-color-name}@{material-color-number}@{extra} { 111 | @material-color-full-name: "@{material-color-name}@{material-color-number}"; 112 | @material-color: @@material-color-full-name; 113 | @text-color: contrast(@material-color, @lightbg-text, @darkbg-text, @contrast-factor); 114 | @func(); 115 | } 116 | 117 | } 118 | 119 | .generic-variations-factory-deep(~""); 120 | } 121 | 122 | .generic-variations-factory(~"red"); 123 | .generic-variations-factory(~"pink"); 124 | .generic-variations-factory(~"purple"); 125 | .generic-variations-factory(~"deep-purple"); 126 | .generic-variations-factory(~"indigo"); 127 | .generic-variations-factory(~"blue"); 128 | .generic-variations-factory(~"light-blue"); 129 | .generic-variations-factory(~"cyan"); 130 | .generic-variations-factory(~"teal"); 131 | .generic-variations-factory(~"green"); 132 | .generic-variations-factory(~"light-green"); 133 | .generic-variations-factory(~"lime"); 134 | .generic-variations-factory(~"yellow"); 135 | .generic-variations-factory(~"amber"); 136 | .generic-variations-factory(~"orange"); 137 | .generic-variations-factory(~"deep-orange"); 138 | .generic-variations-factory(~"brown"); 139 | .generic-variations-factory(~"grey"); 140 | .generic-variations-factory(~"blue-grey"); 141 | 142 | } 143 | 144 | 145 | @all-variations: ~"-default, -primary, -info, -success, -warning, -danger"; 146 | -------------------------------------------------------------------------------- /resources/assets/less/material/_navbar.less: -------------------------------------------------------------------------------- 1 | .navbar { 2 | background-color: @primary; 3 | border: 0; 4 | border-radius: 0; 5 | 6 | .navbar-brand { 7 | position: relative; 8 | height: 60px; 9 | line-height: 30px; 10 | color: inherit; 11 | &:hover, 12 | &:focus { 13 | color: inherit; 14 | background-color: transparent; 15 | } 16 | } 17 | 18 | .navbar-text { 19 | color: inherit; 20 | margin-top: 20px; 21 | margin-bottom: 20px; 22 | } 23 | 24 | .navbar-nav { 25 | > li > a { 26 | color: inherit; 27 | padding-top: 20px; 28 | padding-bottom: 20px; 29 | 30 | &:hover, 31 | &:focus { 32 | color: inherit; 33 | background-color: transparent; 34 | } 35 | } 36 | > .active > a { 37 | &, 38 | &:hover, 39 | &:focus { 40 | color: inherit; 41 | background-color: rgba(255, 255, 255, 0.1); 42 | } 43 | } 44 | > .disabled > a { 45 | &, 46 | &:hover, 47 | &:focus { 48 | color: inherit; 49 | background-color: transparent; 50 | opacity: 0.9; 51 | } 52 | } 53 | } 54 | 55 | // Darken the responsive nav toggle 56 | .navbar-toggle { 57 | border: 0; 58 | &:hover, 59 | &:focus { 60 | background-color: transparent; 61 | } 62 | .icon-bar { 63 | background-color: inherit; 64 | border: 1px solid; 65 | } 66 | } 67 | 68 | .navbar-default .navbar-toggle, 69 | .navbar-inverse .navbar-toggle { 70 | border-color: transparent; 71 | } 72 | 73 | .navbar-collapse, 74 | .navbar-form { 75 | border-color: rgba(0,0,0,0.1); 76 | } 77 | 78 | // Dropdowns 79 | .navbar-nav { 80 | > .open > a { 81 | &, 82 | &:hover, 83 | &:focus { 84 | background-color: transparent; 85 | color: inherit; 86 | } 87 | } 88 | 89 | @media (max-width: 767px) { 90 | .navbar-text { 91 | color: inherit; 92 | margin-top: 15px; 93 | margin-bottom: 15px; 94 | } 95 | 96 | // Dropdowns get custom display 97 | .open .dropdown-menu { 98 | > .dropdown-header { 99 | border: 0; 100 | color: inherit; 101 | } 102 | .divider { 103 | border-bottom: 1px solid; 104 | opacity: 0.08; 105 | } 106 | > li > a { 107 | color: inherit; 108 | &:hover, 109 | &:focus { 110 | color: inherit; 111 | background-color: transparent; 112 | } 113 | } 114 | > .active > a { 115 | &, 116 | &:hover, 117 | &:focus { 118 | color: inherit; 119 | background-color: transparent; 120 | } 121 | } 122 | > .disabled > a { 123 | &, 124 | &:hover, 125 | &:focus { 126 | color: inherit; 127 | background-color: transparent; 128 | } 129 | } 130 | } 131 | } 132 | } 133 | 134 | .navbar-link { 135 | color: inherit; 136 | &:hover { 137 | color: inherit; 138 | } 139 | } 140 | 141 | .btn-link { 142 | color: inherit; 143 | &:hover, 144 | &:focus { 145 | color: inherit; 146 | } 147 | &[disabled], 148 | fieldset[disabled] & { 149 | &:hover, 150 | &:focus { 151 | color: inherit; 152 | } 153 | } 154 | } 155 | 156 | .navbar-form { 157 | margin-top: 16px; 158 | .form-control-wrapper .form-control, .form-control { 159 | border-color: inherit; 160 | color: inherit; 161 | } 162 | .form-control-wrapper { 163 | .material-input:before, input:focus ~ .material-input:after { 164 | background-color: inherit; 165 | } 166 | } 167 | } 168 | 169 | .generic-variations(~".navbar", @primary, { 170 | background-color: @material-color; 171 | color: @text-color; 172 | // deeply defined to override welljumbo class without !impotant need 173 | .navbar-form .form-control-wrapper input.form-control::placeholder, .navbar-form input.form-control::placeholder { 174 | color: @text-color; 175 | } 176 | .dropdown-menu { 177 | li > a { 178 | &:hover, 179 | &:focus { 180 | color: @material-color; 181 | } 182 | } 183 | .active > a { 184 | &:hover, 185 | &:focus { 186 | color: @text-color; 187 | } 188 | background-color: @material-color; 189 | color: @text-color; 190 | } 191 | } 192 | }); 193 | 194 | &-inverse { 195 | background-color: @indigo; 196 | } 197 | 198 | @media (max-width: 1199px) { 199 | 200 | .navbar-brand { 201 | height: 50px; 202 | padding: 10px 15px; 203 | } 204 | .navbar-form { 205 | margin-top: 10px; 206 | } 207 | 208 | .navbar-nav > li > a { 209 | padding-top: 15px; 210 | padding-bottom: 15px; 211 | } 212 | } 213 | } 214 | -------------------------------------------------------------------------------- /resources/assets/less/material/_panels.less: -------------------------------------------------------------------------------- 1 | .panel { 2 | border-radius: 2px; 3 | border: 0; 4 | 5 | .variations(~" > .panel-heading", background-color, @grey-200); 6 | .shadow-z-1; 7 | } 8 | 9 | 10 | [class*="panel-"] > .panel-heading { 11 | color: @darkbg-text; 12 | border: 0; 13 | } 14 | .panel-default, .panel:not([class*="panel-"]) { 15 | > .panel-heading { 16 | color: @lightbg-text; 17 | } 18 | } 19 | .panel-footer { 20 | background-color: @grey-200; 21 | } 22 | -------------------------------------------------------------------------------- /resources/assets/less/material/_plugin-dropdownjs.less: -------------------------------------------------------------------------------- 1 | .dropdownjs:after { 2 | right: 5px; 3 | top: 3px; 4 | font-size: 25px; 5 | position: absolute; 6 | content: "\e894"; 7 | font-family: "Material-Design-Icons"; 8 | speak: none; 9 | font-style: normal; 10 | font-weight: normal; 11 | font-variant: normal; 12 | text-transform: none; 13 | line-height: 1; 14 | -webkit-font-smoothing: antialiased; 15 | -moz-osx-font-smoothing: grayscale; 16 | pointer-events: none; 17 | color: #757575; 18 | 19 | } 20 | -------------------------------------------------------------------------------- /resources/assets/less/material/_plugin-nouislider.less: -------------------------------------------------------------------------------- 1 | .noUi-target, 2 | .noUi-target * { 3 | -webkit-touch-callout: none; 4 | -ms-touch-action: none; 5 | user-select: none; 6 | box-sizing: border-box; 7 | } 8 | .noUi-base { 9 | width: 100%; 10 | height: 100%; 11 | position: relative; 12 | } 13 | .noUi-origin { 14 | position: absolute; 15 | right: 0; 16 | top: 0; 17 | left: 0; 18 | bottom: 0; 19 | } 20 | .noUi-handle { 21 | position: relative; 22 | z-index: 1; 23 | box-sizing: border-box; 24 | } 25 | .noUi-stacking .noUi-handle { 26 | z-index: 10; 27 | } 28 | .noUi-stacking + .noUi-origin { 29 | *z-index: -1; 30 | } 31 | .noUi-state-tap .noUi-origin { 32 | transition: left 0.3s, top 0.3s; 33 | } 34 | .noUi-state-drag * { 35 | cursor: inherit !important; 36 | } 37 | .noUi-horizontal { 38 | height: 10px; 39 | } 40 | .noUi-handle { 41 | box-sizing: border-box; 42 | width: 12px; 43 | height: 12px; 44 | left: -10px; 45 | top: -5px; 46 | cursor: ew-resize; 47 | border-radius: 100%; 48 | transition: all 0.2s ease-out; 49 | border: 1px solid; 50 | } 51 | .noUi-vertical .noUi-handle { 52 | margin-left: 5px; 53 | cursor: ns-resize; 54 | } 55 | .noUi-horizontal.noUi-extended { 56 | padding: 0 15px; 57 | } 58 | .noUi-horizontal.noUi-extended .noUi-origin { 59 | right: -15px; 60 | } 61 | .noUi-background { 62 | height: 2px; 63 | margin: 20px 0; 64 | } 65 | .noUi-origin { 66 | margin: 0; 67 | border-radius: 0; 68 | height: 2px; 69 | background: #c8c8c8; 70 | &[style^="left: 0"] .noUi-handle { 71 | background-color: #fff; 72 | border: 2px solid #c8c8c8; 73 | &.noUi-active { 74 | border-width: 1px; 75 | } 76 | } 77 | } 78 | .noUi-target { 79 | border-radius: 2px; 80 | } 81 | .noUi-horizontal { 82 | height: 2px; 83 | margin: 15px 0; 84 | } 85 | .noUi-vertical { 86 | height: 100%; 87 | width: 2px; 88 | margin: 0 15px; 89 | display: inline-block; 90 | } 91 | .noUi-handle.noUi-active { 92 | transform: scale3d(2.5, 2.5, 1); 93 | } 94 | [disabled].noUi-slider{ 95 | opacity: 0.5; 96 | } 97 | [disabled] .noUi-handle { 98 | cursor: not-allowed; 99 | } 100 | 101 | .slider { 102 | background: #c8c8c8; 103 | } 104 | 105 | .slider { 106 | .variations(~".noUi-connect", background-color, @primary); 107 | .variations(~" .noUi-connect", background-color, @primary); 108 | .variations(~" .noUi-handle", background-color, @primary); 109 | .variations(~" .noUi-handle", border-color, @primary); 110 | } 111 | -------------------------------------------------------------------------------- /resources/assets/less/material/_plugin-selectize.less: -------------------------------------------------------------------------------- 1 | // Support for Selectize plugin 2 | // http://brianreavis.github.io/selectize.js/ 3 | 4 | .selectize-control.single, .selectize-control.multi { 5 | padding: 0; 6 | .selectize-input, .selectize-input.input-active { 7 | 8 | cursor: text; 9 | background: transparent; 10 | box-shadow: none; 11 | border: 0; 12 | padding: 0; 13 | height: 100%; 14 | font-size: 14px; 15 | line-height: 30px; 16 | .has-items { 17 | padding: 0; 18 | } 19 | &:after { 20 | right: 5px; 21 | position: absolute; 22 | font-size: 7px; 23 | content: "\e894"; 24 | font-family: "Material-Design-Icons"; 25 | speak: none; 26 | font-style: normal; 27 | font-weight: normal; 28 | font-variant: normal; 29 | text-transform: none; 30 | line-height: 4; 31 | -webkit-font-smoothing: antialiased; 32 | -moz-osx-font-smoothing: grayscale; 33 | } 34 | input { 35 | font-size: 14px; 36 | outline: 0px; 37 | border: 0px; 38 | background: transparent; 39 | } 40 | &.floating-label-fix input { 41 | opacity: 0; 42 | } 43 | > div, > .item { 44 | display: inline-block; 45 | margin: 0 8px 3px 0; 46 | padding: 0; 47 | background: transparent; 48 | border: 0; 49 | &:after { 50 | content: ","; 51 | } 52 | &:last-of-type:after { 53 | content: ""; 54 | } 55 | &.active { 56 | font-weight: bold; 57 | background: transparent; 58 | border: 0; 59 | } 60 | } 61 | } 62 | .selectize-dropdown { 63 | position: absolute; 64 | z-index: 1000; 65 | border: 0; 66 | width: 100% !important; 67 | left: 0 !important; 68 | height: auto; 69 | background-color: #FFF; 70 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); 71 | border-radius: 2px; 72 | padding: 0; 73 | margin-top: 3px; 74 | .active { 75 | background-color: inherit; 76 | } 77 | .highlight { 78 | background-color: #d5d8ff; 79 | } 80 | .selected, .selected.active { 81 | background-color: #EEEEEE; 82 | } 83 | [data-selectable], .optgroup-header { 84 | padding: 10px 20px; 85 | cursor: pointer; 86 | } 87 | } 88 | .dropdown-active ~ .selectize-dropdown { 89 | display: block; 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /resources/assets/less/material/_plugin-snackbarjs.less: -------------------------------------------------------------------------------- 1 | // Support for SnackbarJS plugin 2 | // https://github.com/FezVrasta/snackbarjs 3 | 4 | .snackbar { 5 | // Style 6 | background-color: #323232; 7 | color: @darkbg-text; 8 | font-size: 14px; 9 | border-radius: 2px; 10 | .shadow-z-1; 11 | 12 | // Animation 13 | height: 0; 14 | transition: transform 0.2s ease-in-out, opacity 0.2s ease-in, height 0 linear 0.2s, padding 0 linear 0.2s, height 0 linear 0.2s; 15 | transform: translateY(200%); 16 | } 17 | 18 | .snackbar.snackbar-opened { 19 | // Style 20 | padding: 14px 15px; 21 | margin-bottom: 20px; 22 | 23 | // Animation 24 | height: auto; 25 | transition: transform 0.2s ease-in-out, opacity 0.2s ease-in, height 0 linear 0.2s, height 0 linear 0.2s; 26 | transform: none; 27 | } 28 | 29 | // Variations 30 | .snackbar.toast { 31 | border-radius: 200px; 32 | } 33 | -------------------------------------------------------------------------------- /resources/assets/less/material/_popups.less: -------------------------------------------------------------------------------- 1 | .popover, .tooltip-inner { 2 | color: @popover-color; 3 | line-height: 1em; 4 | background: @popover-background; 5 | border: none; 6 | border-radius: @material-border-radius; 7 | .shadow-z-1(); 8 | } 9 | 10 | .tooltip, .tooltip.in { 11 | opacity: 1; 12 | } 13 | 14 | .popover, .tooltip { 15 | .arrow, .tooltip-arrow { 16 | display: none; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /resources/assets/less/material/_progress.less: -------------------------------------------------------------------------------- 1 | .progress { 2 | height: 4px; 3 | border-radius: 0; 4 | box-shadow: none; 5 | background: #c8c8c8; 6 | .progress-bar { 7 | box-shadow: none; 8 | .variations(~"", background-color, @primary); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /resources/assets/less/material/_radios.less: -------------------------------------------------------------------------------- 1 | .form-horizontal .radio { 2 | margin-bottom: 10px; 3 | } 4 | .radio { 5 | label { 6 | cursor: pointer; 7 | padding-left: 45px; 8 | position: relative; 9 | span { 10 | display: block; 11 | position: absolute; 12 | left: 10px; 13 | top: 2px; 14 | transition-duration: 0.2s; 15 | } 16 | .circle { 17 | border: 2px solid @lightbg-text; 18 | height: 15px; 19 | width: 15px; 20 | border-radius: 100%; 21 | } 22 | .check { 23 | height: 15px; 24 | width: 15px; 25 | border-radius: 100%; 26 | background-color: @radio-default; 27 | transform: scale3d(0, 0, 0); 28 | } 29 | .check:after { 30 | display: block; 31 | position: absolute; 32 | content: ""; 33 | background-color: @lightbg-text; 34 | left: -18px; 35 | top: -18px; 36 | height: 50px; 37 | width: 50px; 38 | border-radius: 100%; 39 | z-index: 1; 40 | opacity: 0; 41 | margin: 0; 42 | transform: scale3d(1.5, 1.5, 1); 43 | } 44 | input[type=radio]:not(:checked) ~ .check:after { 45 | animation: rippleOff 500ms; 46 | } 47 | input[type=radio]:checked ~ .check:after { 48 | animation: rippleOn 500ms; 49 | } 50 | 51 | } 52 | .variations(~" input[type=radio]:checked ~ .check", background-color, @radio-default); 53 | .variations(~" input[type=radio]:checked ~ .circle", border-color, @radio-default); 54 | 55 | input[type=radio][disabled] ~ .check, 56 | input[type=radio][disabled] ~ .circle { 57 | opacity: 0.5; 58 | } 59 | 60 | input[type=radio] { 61 | opacity: 0; 62 | height: 0; 63 | width: 0; 64 | overflow: hidden; 65 | } 66 | input[type=radio]:checked ~ .check { 67 | transform: scale3d(0.55, 0.55, 1); 68 | } 69 | input[type=radio][disabled] ~ .circle { 70 | border-color: @lightbg-text; 71 | } 72 | input[type=radio][disabled] ~ .check { 73 | background-color: @lightbg-text; 74 | } 75 | 76 | } 77 | 78 | @keyframes rippleOn { 79 | 0% { 80 | opacity: 0; 81 | } 82 | 50% { 83 | opacity: 0.2; 84 | } 85 | 100% { 86 | opacity: 0; 87 | } 88 | } 89 | 90 | @keyframes rippleOff { 91 | 0% { 92 | opacity: 0; 93 | } 94 | 50% { 95 | opacity: 0.2; 96 | } 97 | 100% { 98 | opacity: 0; 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /resources/assets/less/material/_shadows.less: -------------------------------------------------------------------------------- 1 | .shadow-z-1 { 2 | box-shadow: 3 | 0 1px 6px 0 rgba(0, 0, 0, 0.12), 4 | 0 1px 6px 0 rgba(0, 0, 0, 0.12); 5 | } 6 | 7 | .shadow-z-1-hover { 8 | box-shadow: 9 | 0 5px 11px 0 rgba(0, 0, 0, 0.18), 10 | 0 4px 15px 0 rgba(0, 0, 0, 0.15); 11 | } 12 | 13 | .shadow-z-2 { 14 | box-shadow: 15 | 0 8px 17px 0 rgba(0, 0, 0, 0.2), 16 | 0 6px 20px 0 rgba(0, 0, 0, 0.19); 17 | } 18 | 19 | .shadow-z-3 { 20 | box-shadow: 21 | 0 12px 15px 0 rgba(0, 0, 0, 0.24), 22 | 0 17px 50px 0 rgba(0, 0, 0, 0.19); 23 | } 24 | 25 | .shadow-z-4 { 26 | box-shadow: 27 | 0 16px 28px 0 rgba(0, 0, 0, 0.22), 28 | 0 25px 55px 0 rgba(0, 0, 0, 0.21); 29 | } 30 | 31 | .shadow-z-5 { 32 | box-shadow: 33 | 0 27px 24px 0 rgba(0, 0, 0, 0.2), 34 | 0 40px 77px 0 rgba(0, 0, 0, 0.22); 35 | } 36 | -------------------------------------------------------------------------------- /resources/assets/less/material/_tabs.less: -------------------------------------------------------------------------------- 1 | .nav-tabs { 2 | background: @primary; 3 | > li { 4 | > a { 5 | color: #FFFFFF; 6 | border: 0; 7 | margin: 0; 8 | &:hover { 9 | background-color: transparent; 10 | border: 0; 11 | } 12 | } 13 | & > a, & > a:hover, & > a:focus { 14 | background-color: transparent !important; 15 | border: 0 !important; 16 | color: #FFFFFF !important; 17 | font-weight: 500; 18 | } 19 | &.disabled > a, &.disabled > a:hover { 20 | color: rgba(255,255,255,0.5); 21 | } 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /resources/assets/less/material/_togglebutton.less: -------------------------------------------------------------------------------- 1 | .togglebutton { 2 | vertical-align: middle; 3 | &, label, input, .toggle { 4 | user-select: none; 5 | } 6 | label { 7 | font-weight: 400; 8 | cursor: pointer; 9 | // Hide original checkbox 10 | input[type=checkbox] { 11 | opacity: 0; 12 | width: 0; 13 | height:0; 14 | } 15 | // Switch bg off and disabled 16 | .toggle, 17 | input[type=checkbox][disabled] + .toggle { 18 | content: ""; 19 | display: inline-block; 20 | width: 30px; 21 | height: 15px; 22 | background-color: rgba(80, 80, 80, 0.7); 23 | border-radius: 15px; 24 | margin-right: 10px; 25 | transition: background 0.3s ease; 26 | vertical-align: middle; 27 | } 28 | // Handle off 29 | .toggle:after { 30 | content: ""; 31 | display: inline-block; 32 | width: 20px; 33 | height: 20px; 34 | background-color: #F1F1F1; 35 | border-radius: 20px; 36 | position: relative; 37 | box-shadow: 0 1px 3px 1px rgba(0,0,0,0.4); 38 | left: -5px; 39 | top: -2px; 40 | transition: left 0.3s ease, background 0.3s ease, box-shadow 0.1s ease; 41 | } 42 | // Handle disabled 43 | input[type=checkbox][disabled] + .toggle:after, 44 | input[type=checkbox][disabled]:checked + .toggle:after{ 45 | background-color: #BDBDBD; 46 | } 47 | // Ripple off and disabled 48 | input[type=checkbox] + .toggle:active:after, 49 | input[type=checkbox][disabled] + .toggle:active:after { 50 | box-shadow: 0 1px 3px 1px rgba(0,0,0,0.4), 0 0 0 15px rgba(0, 0, 0, 0.1); 51 | } 52 | input[type=checkbox]:checked + .toggle:after { 53 | left: 15px; 54 | } 55 | } 56 | 57 | // Switch bg on 58 | .generic-variations(~" label input[type=checkbox]:checked + .toggle", @primary, { 59 | background-color: fade(@material-color, 50%); 60 | }); 61 | // Handle on 62 | .variations(~" label input[type=checkbox]:checked + .toggle:after", background-color, @primary); 63 | // Ripple on 64 | .generic-variations(~" label input[type=checkbox]:checked + .toggle:active:after", @primary, { 65 | box-shadow: 0 1px 3px 1px rgba(0,0,0,0.4), 0 0 0 15px fade(@material-color, 10%); 66 | }); 67 | } 68 | -------------------------------------------------------------------------------- /resources/assets/less/material/_variables.less: -------------------------------------------------------------------------------- 1 | // material icons path 2 | @material-font-path: "../fonts"; 3 | 4 | // Bootstrap shades 5 | @primary: @teal; 6 | @success: @green; 7 | @info: @light-blue; 8 | @warning: @deep-orange; 9 | @danger: @red; 10 | 11 | @brand-primary: @primary; 12 | @brand-success: @success; 13 | @brand-danger: @danger; 14 | @brand-warning: @warning; 15 | @brand-info: @info; 16 | 17 | // Typography elements for Material 18 | @darkbg-text: rgba(255,255,255,0.84); 19 | @lightbg-text: rgba(0,0,0,0.84); 20 | @icon-color: rgba(0,0,0,0.5); 21 | 22 | 23 | // Bootstrap variables 24 | @body-bg: #EEEEEE; 25 | 26 | @btn-default: transparent; 27 | @btn-default-text: @lightbg-text; 28 | 29 | @btn-primary: @primary; 30 | @btn-primary-text: @darkbg-text; 31 | 32 | @btn-success: @success; 33 | @btn-success-text: @darkbg-text; 34 | 35 | @btn-info: @info; 36 | @btn-info-text: @darkbg-text; 37 | 38 | @btn-warning: @warning; 39 | @btn-warning-text: @darkbg-text; 40 | 41 | @btn-danger: @danger; 42 | @btn-danger-text: @darkbg-text; 43 | 44 | @input-unchecked: rgba(137, 137, 137, 0.3); 45 | @input-checked: rgba(15, 157, 88, 0.3); 46 | 47 | @radio-default: @lightbg-text; 48 | @radio-primary: @primary; 49 | @radio-success: @success; 50 | @radio-info: @info; 51 | @radio-warning: @warning; 52 | @radio-danger: @danger; 53 | 54 | @input-danger: @danger; 55 | @input-default: @primary; 56 | @input-warning: @warning; 57 | @input-success: @success; 58 | @input-info: @info; 59 | 60 | @alert-success: @success; 61 | @alert-info: @info; 62 | @alert-warning: @warning; 63 | @alert-danger: @danger; 64 | 65 | @progress-success: @success; 66 | @progress-info: @info; 67 | @progress-warning: @warning; 68 | @progress-danger: @danger; 69 | 70 | // Global Material variables 71 | @material-border-radius: 2px; 72 | @input-underline-color: #D2D2D2; 73 | 74 | // Card 75 | @card-body-text: @lightbg-text; 76 | @card-body-background: #fff; 77 | @card-image-headline: #fff; 78 | 79 | @text-disabled: #a8a8a8; 80 | @background-disabled: #eaeaea; 81 | 82 | // Checkboxes 83 | @checkbox-size: 20px; 84 | @checkbox-animation-ripple: 500ms; 85 | @checkbox-animation-check: 0.3s; 86 | 87 | // Popovers and Popups 88 | @popover-background: rgba(101, 101, 101, 0.9); 89 | @popover-color: #ececec; 90 | -------------------------------------------------------------------------------- /resources/assets/less/material/_welljumbo.less: -------------------------------------------------------------------------------- 1 | body, .container, .container-fluid { 2 | 3 | .well, .well:not([class^="well well-material-"]) { 4 | &, .form-control { 5 | color: @lightbg-text; 6 | } 7 | .floating-label { 8 | color: #7e7e7e; 9 | } 10 | .form-control { 11 | &::-webkit-input-placeholder { 12 | color: #7e7e7e; 13 | } 14 | &::-moz-placeholder { 15 | color: #7e7e7e; 16 | opacity: 1; 17 | } 18 | &:-ms-input-placeholder { 19 | color: #7e7e7e; 20 | } 21 | } 22 | .option, .create { 23 | color: @lightbg-text; 24 | } 25 | } 26 | .well.well-sm { 27 | padding: 10px; 28 | } 29 | .well.well-lg { 30 | padding: 26px; 31 | } 32 | 33 | [class^="well well-material-"] { 34 | &, .form-control, .floating-label { 35 | color: @darkbg-text; 36 | } 37 | .form-control { 38 | border-bottom-color: @darkbg-text; 39 | &::-webkit-input-placeholder { 40 | color: @darkbg-text; 41 | } 42 | &::-moz-placeholder { 43 | color: @darkbg-text; 44 | opacity: 1; 45 | } 46 | &:-ms-input-placeholder { 47 | color: @darkbg-text; 48 | } 49 | } 50 | // Rule to fix selectize plugin 51 | .option, .create { 52 | color: @lightbg-text; 53 | } 54 | } 55 | 56 | .well, .jumbotron { 57 | 58 | background-color: #fff; 59 | padding: 19px; 60 | margin-bottom: 20px; 61 | .shadow-z-2(); 62 | border-radius: 2px; 63 | border: 0; 64 | p { 65 | font-weight: 300; 66 | } 67 | 68 | .variations(~"", background-color, #FFF); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /resources/assets/less/material/material-fullpalette.less: -------------------------------------------------------------------------------- 1 | @import "material.less"; 2 | @import "_mixins-fullpalette.less"; 3 | -------------------------------------------------------------------------------- /resources/assets/less/material/material.less: -------------------------------------------------------------------------------- 1 | @import "_variables.less"; 2 | @import "_colors.less"; 3 | @import "_mixins.less"; 4 | @import "_icons-material-design.less"; 5 | 6 | body { 7 | background-color: @body-bg; 8 | &.inverse { 9 | background: #333333; 10 | &, .form-control { 11 | color: @darkbg-text; 12 | } 13 | .modal, 14 | .panel-default, 15 | .card { 16 | &, 17 | .form-control { 18 | background-color: initial; 19 | color: initial; 20 | } 21 | } 22 | 23 | } 24 | } 25 | 26 | 27 | body, h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4 { 28 | font-family: "RobotoDraft", "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; 29 | font-weight: 300; 30 | } 31 | 32 | h5, h6{ 33 | font-weight: 400; 34 | } 35 | 36 | a, a:hover, a:focus { 37 | color: @primary; 38 | } 39 | 40 | // Well and Jumbotrons 41 | @import "_welljumbo.less"; 42 | 43 | // Buttons 44 | @import "_buttons.less"; 45 | 46 | // Checkboxes 47 | @import "_checkboxes.less"; 48 | 49 | // Toggle buttons 50 | @import "_togglebutton.less"; 51 | 52 | // Radios 53 | @import "_radios.less"; 54 | 55 | // Text inputs 56 | @import "_inputs.less"; 57 | 58 | legend { 59 | border-bottom: 0; 60 | } 61 | 62 | // Lists 63 | @import "_lists.less"; 64 | 65 | // Navbar 66 | @import "_navbar.less"; 67 | 68 | .dropdown-menu { 69 | border: 0; 70 | box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26); 71 | .divider { 72 | background-color: rgba(229, 229, 229, 0.12); 73 | } 74 | li { 75 | overflow: hidden; 76 | position: relative; 77 | a:hover { 78 | background-color: transparent; 79 | color: @primary; 80 | } 81 | } 82 | .variations(~" li a:hover", color, @primary); 83 | } 84 | 85 | // Alerts 86 | @import "_alerts.less"; 87 | 88 | // Progress bar 89 | @import "_progress.less"; 90 | 91 | // Typography 92 | .text-warning { 93 | color: @btn-warning; 94 | } 95 | .text-primary { 96 | color: @btn-primary; 97 | } 98 | .text-danger { 99 | color: @btn-danger; 100 | } 101 | .text-success { 102 | color: @btn-success; 103 | } 104 | .text-info { 105 | color: @btn-info; 106 | } 107 | 108 | @import "_tabs.less"; 109 | 110 | @import "_popups.less"; 111 | 112 | @import "_icons.less"; 113 | 114 | @import "_cards.less"; 115 | 116 | @import "_dialogs.less"; 117 | 118 | @import "_labels.less"; 119 | 120 | @import "_panels.less"; 121 | 122 | @import "_dividers.less"; 123 | 124 | // Prevent highlight on mobile 125 | * { 126 | -webkit-tap-highlight-color: rgba(255, 255, 255, 0); 127 | -webkit-tap-highlight-color: transparent; 128 | &:focus { 129 | outline: 0; 130 | } 131 | } 132 | 133 | 134 | // External plugins 135 | @import "_plugin-snackbarjs.less"; 136 | @import "_plugin-nouislider.less"; 137 | @import "_plugin-selectize.less"; 138 | @import "_plugin-dropdownjs.less"; 139 | 140 | // Material shadows 141 | // Place them on bottom of stylesheet to increase the importance of it and override other same-specificity selectors 142 | @import "_shadows.less"; 143 | -------------------------------------------------------------------------------- /resources/assets/less/material/ripples.less: -------------------------------------------------------------------------------- 1 | .withripple { 2 | position: relative; 3 | } 4 | .ripple-wrapper { 5 | position: absolute; 6 | top: 0; 7 | left: 0; 8 | z-index: 1; 9 | width: 100%; 10 | height: 100%; 11 | overflow: hidden; 12 | border-radius: inherit; 13 | pointer-events: none; 14 | } 15 | .ripple { 16 | position: absolute; 17 | width: 20px; 18 | height: 20px; 19 | margin-left: -10px; 20 | margin-top: -10px; 21 | border-radius: 100%; 22 | background-color: rgba(0,0,0,0.05); 23 | transform: scale(1); 24 | transform-origin: 50%; 25 | opacity: 0; 26 | pointer-events: none; 27 | } 28 | .ripple.ripple-on { 29 | transition: opacity 0.15s ease-in 0s, transform 0.5s cubic-bezier(0.4, 0, 0.2, 1) 0.1s; 30 | opacity: 0.1; 31 | } 32 | .ripple.ripple-out { 33 | transition: opacity 0.1s linear 0s !important; 34 | opacity: 0; 35 | } 36 | -------------------------------------------------------------------------------- /resources/assets/less/material/roboto.less: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'RobotoDraft'; 3 | font-style: normal; 4 | font-weight: 400; 5 | //src: local('RobotoDraft'), local('RobotoDraft-Regular'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/robotodraft/v1/0xES5Sl_v6oyT7dAKuoni4gp9Q8gbYrhqGlRav_IXfk.woff2) format('woff2'), url(https://fonts.gstatic.com/s/robotodraft/v1/0xES5Sl_v6oyT7dAKuoni7rIa-7acMAeDBVuclsi6Gc.woff) format('woff'); 6 | src: local('RobotoDraft'), 7 | local('RobotoDraft-Regular'), 8 | local('Roboto-Regular'), 9 | url(../fonts/RobotoDraftRegular.woff2) format('woff2'), 10 | url(../fonts/RobotoDraftRegular.woff) format('woff'); 11 | } 12 | 13 | @font-face { 14 | font-family: 'RobotoDraft'; 15 | font-style: normal; 16 | font-weight: 500; 17 | //src: local('RobotoDraft Medium'), local('RobotoDraft-Medium'), local('Roboto-Medium'), url(https://fonts.gstatic.com/s/robotodraft/v1/u0_CMoUf3y3-4Ss4ci-VwXJuJo8UJJfpGKt7pXjBv4s.woff2) format('woff2'), url(https://fonts.gstatic.com/s/robotodraft/v1/u0_CMoUf3y3-4Ss4ci-VwaTA90I55Xt7owhZwpPnMsc.woff) format('woff'); 18 | src: local('RobotoDraft Medium'), 19 | local('RobotoDraft-Medium'), 20 | local('Roboto-Medium'), 21 | url(../fonts/RobotoDraftMedium.woff2) format('woff2'), 22 | url(../fonts/RobotoDraftMedium.woff) format('woff'); 23 | } 24 | 25 | @font-face { 26 | font-family: 'RobotoDraft'; 27 | font-style: normal; 28 | font-weight: 700; 29 | //src: local('RobotoDraft Bold'), local('RobotoDraft-Bold'), local('Roboto-Bold'), url(https://fonts.gstatic.com/s/robotodraft/v1/u0_CMoUf3y3-4Ss4ci-Vwf79_ZuUxCigM2DespTnFaw.woff2) format('woff2'), url(https://fonts.gstatic.com/s/robotodraft/v1/u0_CMoUf3y3-4Ss4ci-VwRbnBKKEOwRKgsHDreGcocg.woff) format('woff'); 30 | src: local('RobotoDraft Bold'), 31 | local('RobotoDraft-Bold'), 32 | local('Roboto-Bold'), 33 | url(../fonts/RobotoDraftBold.woff2) format('woff2'), 34 | url(../fonts/RobotoDraftBold.woff) format('woff'); 35 | } 36 | 37 | @font-face { 38 | font-family: 'RobotoDraft'; 39 | font-style: italic; 40 | font-weight: 400; 41 | //src: local('RobotoDraft Italic'), local('RobotoDraft-Italic'), local('Roboto-Italic'), url(https://fonts.gstatic.com/s/robotodraft/v1/er-TIW55l9KWsTS1x9bTfgeOulFbQKHxPa89BaxZzA0.woff2) format('woff2'), url(https://fonts.gstatic.com/s/robotodraft/v1/er-TIW55l9KWsTS1x9bTfoo3ZslTYfJv0R05CazkwN8.woff) format('woff'); 42 | src: local('RobotoDraft Italic'), 43 | local('RobotoDraft-Italic'), 44 | local('Roboto-Italic'), 45 | url(../fonts/RobotoDraftItalic.woff2) format('woff2'), 46 | url(../fonts/RobotoDraftItalic.woff) format('woff'); 47 | } 48 | -------------------------------------------------------------------------------- /resources/assets/less/sb/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | -------------------------------------------------------------------------------- /resources/assets/less/sb/sb-admin-2.less: -------------------------------------------------------------------------------- 1 | @import "variables.less"; 2 | @import "mixins.less"; 3 | 4 | // Global Styles 5 | 6 | body { 7 | background-color: @gray-lightest; 8 | } 9 | 10 | // Wrappers 11 | 12 | #wrapper { 13 | width: 100%; 14 | } 15 | 16 | #page-wrapper { 17 | padding: 0 15px; 18 | min-height: 568px; 19 | background-color: white; 20 | } 21 | 22 | @media(min-width:768px) { 23 | #page-wrapper { 24 | position: inherit; 25 | margin: 0 0 0 250px; 26 | padding: 0 30px; 27 | border-left: 1px solid darken(@gray-lightest, 6.5%); 28 | } 29 | } 30 | 31 | // Navigation 32 | 33 | // --Topbar 34 | 35 | .navbar-top-links { 36 | margin-right: 0; 37 | } 38 | 39 | .navbar-top-links li { 40 | display: inline-block; 41 | } 42 | 43 | .navbar-top-links li:last-child { 44 | margin-right: 15px; 45 | } 46 | 47 | .navbar-top-links li a { 48 | padding: 15px; 49 | min-height: 50px; 50 | } 51 | 52 | .navbar-top-links .dropdown-menu li { 53 | display: block; 54 | } 55 | 56 | .navbar-top-links .dropdown-menu li:last-child { 57 | margin-right: 0; 58 | } 59 | 60 | .navbar-top-links .dropdown-menu li a { 61 | padding: 3px 20px; 62 | min-height: 0; 63 | } 64 | 65 | .navbar-top-links .dropdown-menu li a div { 66 | white-space: normal; 67 | } 68 | 69 | .navbar-top-links .dropdown-messages, 70 | .navbar-top-links .dropdown-tasks, 71 | .navbar-top-links .dropdown-alerts { 72 | width: 310px; 73 | min-width: 0; 74 | } 75 | 76 | .navbar-top-links .dropdown-messages { 77 | margin-left: 5px; 78 | } 79 | 80 | .navbar-top-links .dropdown-tasks { 81 | margin-left: -59px; 82 | } 83 | 84 | .navbar-top-links .dropdown-alerts { 85 | margin-left: -123px; 86 | } 87 | 88 | .navbar-top-links .dropdown-user { 89 | right: 0; 90 | left: auto; 91 | } 92 | 93 | // --Sidebar 94 | 95 | .sidebar { 96 | .sidebar-nav.navbar-collapse { 97 | padding-left: 0; 98 | padding-right: 0; 99 | } 100 | } 101 | 102 | .sidebar .sidebar-search { 103 | padding: 15px; 104 | } 105 | 106 | .sidebar ul li { 107 | border-bottom: 1px solid darken(@gray-lightest, 6.5%); 108 | a { 109 | &.active { 110 | background-color: @gray-lighter; 111 | } 112 | } 113 | } 114 | 115 | .sidebar .arrow { 116 | float: right; 117 | } 118 | 119 | .sidebar .fa.arrow:before { 120 | content: "\f104"; 121 | } 122 | 123 | .sidebar .active > a > .fa.arrow:before { 124 | content: "\f107"; 125 | } 126 | 127 | .sidebar .nav-second-level li, 128 | .sidebar .nav-third-level li { 129 | border-bottom: none !important; 130 | } 131 | 132 | .sidebar .nav-second-level li a { 133 | padding-left: 37px; 134 | } 135 | 136 | .sidebar .nav-third-level li a { 137 | padding-left: 52px; 138 | } 139 | 140 | @media(min-width:768px) { 141 | .sidebar { 142 | z-index: 1; 143 | position: absolute; 144 | width: 250px; 145 | margin-top: 51px; 146 | } 147 | 148 | .navbar-top-links .dropdown-messages, 149 | .navbar-top-links .dropdown-tasks, 150 | .navbar-top-links .dropdown-alerts { 151 | margin-left: auto; 152 | } 153 | } 154 | 155 | // Buttons 156 | 157 | .btn-outline { 158 | color: inherit; 159 | background-color: transparent; 160 | transition: all .5s; 161 | } 162 | 163 | .btn-primary.btn-outline { 164 | color: @brand-primary; 165 | } 166 | 167 | .btn-success.btn-outline { 168 | color: @brand-success; 169 | } 170 | 171 | .btn-info.btn-outline { 172 | color: @brand-info; 173 | } 174 | 175 | .btn-warning.btn-outline { 176 | color: @brand-warning; 177 | } 178 | 179 | .btn-danger.btn-outline { 180 | color: @brand-danger; 181 | } 182 | 183 | .btn-primary.btn-outline:hover, 184 | .btn-success.btn-outline:hover, 185 | .btn-info.btn-outline:hover, 186 | .btn-warning.btn-outline:hover, 187 | .btn-danger.btn-outline:hover { 188 | color: white; 189 | } 190 | 191 | // Chat Widget 192 | 193 | .chat { 194 | margin: 0; 195 | padding: 0; 196 | list-style: none; 197 | } 198 | 199 | .chat li { 200 | margin-bottom: 10px; 201 | padding-bottom: 5px; 202 | border-bottom: 1px dotted @gray-light; 203 | } 204 | 205 | .chat li.left .chat-body { 206 | margin-left: 60px; 207 | } 208 | 209 | .chat li.right .chat-body { 210 | margin-right: 60px; 211 | } 212 | 213 | .chat li .chat-body p { 214 | margin: 0; 215 | } 216 | 217 | .panel .slidedown .glyphicon, 218 | .chat .glyphicon { 219 | margin-right: 5px; 220 | } 221 | 222 | .chat-panel .panel-body { 223 | height: 350px; 224 | overflow-y: scroll; 225 | } 226 | 227 | // Login Page 228 | 229 | .login-panel { 230 | margin-top: 25%; 231 | } 232 | 233 | // Flot Charts Containers 234 | 235 | .flot-chart { 236 | display: block; 237 | height: 400px; 238 | } 239 | 240 | .flot-chart-content { 241 | width: 100%; 242 | height: 100%; 243 | } 244 | 245 | // DataTables Overrides 246 | 247 | table.dataTable thead .sorting, 248 | table.dataTable thead .sorting_asc, 249 | table.dataTable thead .sorting_desc, 250 | table.dataTable thead .sorting_asc_disabled, 251 | table.dataTable thead .sorting_desc_disabled { 252 | background: transparent; 253 | } 254 | 255 | table.dataTable thead .sorting_asc:after { 256 | content: "\f0de"; 257 | float: right; 258 | font-family: fontawesome; 259 | } 260 | 261 | table.dataTable thead .sorting_desc:after { 262 | content: "\f0dd"; 263 | float: right; 264 | font-family: fontawesome; 265 | } 266 | 267 | table.dataTable thead .sorting:after { 268 | content: "\f0dc"; 269 | float: right; 270 | font-family: fontawesome; 271 | color: rgba(50,50,50,.5); 272 | } 273 | 274 | // Circle Buttons 275 | 276 | .btn-circle { 277 | width: 30px; 278 | height: 30px; 279 | padding: 6px 0; 280 | border-radius: 15px; 281 | text-align: center; 282 | font-size: 12px; 283 | line-height: 1.428571429; 284 | } 285 | 286 | .btn-circle.btn-lg { 287 | width: 50px; 288 | height: 50px; 289 | padding: 10px 16px; 290 | border-radius: 25px; 291 | font-size: 18px; 292 | line-height: 1.33; 293 | } 294 | 295 | .btn-circle.btn-xl { 296 | width: 70px; 297 | height: 70px; 298 | padding: 10px 16px; 299 | border-radius: 35px; 300 | font-size: 24px; 301 | line-height: 1.33; 302 | } 303 | 304 | // Grid Demo Elements 305 | 306 | .show-grid [class^="col-"] { 307 | padding-top: 10px; 308 | padding-bottom: 10px; 309 | border: 1px solid #ddd; 310 | background-color: #eee !important; 311 | } 312 | 313 | .show-grid { 314 | margin: 15px 0; 315 | } 316 | 317 | // Custom Colored Panels 318 | 319 | .huge { 320 | font-size: 40px; 321 | } 322 | 323 | .panel-green { 324 | border-color: @brand-success; 325 | .panel-heading { 326 | border-color: @brand-success; 327 | color: white; 328 | background-color: @brand-success; 329 | } 330 | a { 331 | color: @brand-success; 332 | &:hover { 333 | color: darken(@brand-success, 15%); 334 | } 335 | } 336 | } 337 | 338 | .panel-red { 339 | border-color: @brand-danger; 340 | .panel-heading { 341 | border-color: @brand-danger; 342 | color: white; 343 | background-color: @brand-danger; 344 | } 345 | a { 346 | color: @brand-danger; 347 | &:hover { 348 | color: darken(@brand-danger, 15%); 349 | } 350 | } 351 | } 352 | 353 | .panel-yellow { 354 | border-color: @brand-warning; 355 | .panel-heading { 356 | border-color: @brand-warning; 357 | color: white; 358 | background-color: @brand-warning; 359 | } 360 | a { 361 | color: @brand-warning; 362 | &:hover { 363 | color: darken(@brand-warning, 15%); 364 | } 365 | } 366 | } 367 | -------------------------------------------------------------------------------- /resources/assets/less/sb/variables.less: -------------------------------------------------------------------------------- 1 | // Variables 2 | 3 | @gray-darker: lighten(#000, 13.5%); 4 | @gray-dark: lighten(#000, 20%); 5 | @gray: lighten(#000, 33.5%); 6 | @gray-light: lighten(#000, 60%); 7 | @gray-lighter: lighten(#000, 93.5%); 8 | @gray-lightest: lighten(#000, 97.25%); 9 | @brand-primary: #428bca; 10 | @brand-success: #5cb85c; 11 | @brand-info: #5bc0de; 12 | @brand-warning: #f0ad4e; 13 | @brand-danger: #d9534f; 14 | 15 | -------------------------------------------------------------------------------- /resources/lang/en/pagination.php: -------------------------------------------------------------------------------- 1 | '« Previous', 17 | 'next' => 'Next »', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /resources/lang/en/passwords.php: -------------------------------------------------------------------------------- 1 | 'Passwords must be at least six characters and match the confirmation.', 17 | 'user' => "We can't find a user with that e-mail address.", 18 | 'token' => 'This password reset token is invalid.', 19 | 'sent' => 'We have e-mailed your password reset link!', 20 | 'reset' => 'Your password has been reset!', 21 | 22 | ]; 23 | -------------------------------------------------------------------------------- /resources/lang/en/validation.php: -------------------------------------------------------------------------------- 1 | 'The :attribute must be accepted.', 17 | 'active_url' => 'The :attribute is not a valid URL.', 18 | 'after' => 'The :attribute must be a date after :date.', 19 | 'alpha' => 'The :attribute may only contain letters.', 20 | 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', 21 | 'alpha_num' => 'The :attribute may only contain letters and numbers.', 22 | 'array' => 'The :attribute must be an array.', 23 | 'before' => 'The :attribute must be a date before :date.', 24 | 'between' => [ 25 | 'numeric' => 'The :attribute must be between :min and :max.', 26 | 'file' => 'The :attribute must be between :min and :max kilobytes.', 27 | 'string' => 'The :attribute must be between :min and :max characters.', 28 | 'array' => 'The :attribute must have between :min and :max items.', 29 | ], 30 | 'boolean' => 'The :attribute field must be true or false.', 31 | 'confirmed' => 'The :attribute confirmation does not match.', 32 | 'date' => 'The :attribute is not a valid date.', 33 | 'date_format' => 'The :attribute does not match the format :format.', 34 | 'different' => 'The :attribute and :other must be different.', 35 | 'digits' => 'The :attribute must be :digits digits.', 36 | 'digits_between' => 'The :attribute must be between :min and :max digits.', 37 | 'email' => 'The :attribute must be a valid email address.', 38 | 'filled' => 'The :attribute field is required.', 39 | 'exists' => 'The selected :attribute is invalid.', 40 | 'image' => 'The :attribute must be an image.', 41 | 'in' => 'The selected :attribute is invalid.', 42 | 'integer' => 'The :attribute must be an integer.', 43 | 'ip' => 'The :attribute must be a valid IP address.', 44 | 'max' => [ 45 | 'numeric' => 'The :attribute may not be greater than :max.', 46 | 'file' => 'The :attribute may not be greater than :max kilobytes.', 47 | 'string' => 'The :attribute may not be greater than :max characters.', 48 | 'array' => 'The :attribute may not have more than :max items.', 49 | ], 50 | 'mimes' => 'The :attribute must be a file of type: :values.', 51 | 'min' => [ 52 | 'numeric' => 'The :attribute must be at least :min.', 53 | 'file' => 'The :attribute must be at least :min kilobytes.', 54 | 'string' => 'The :attribute must be at least :min characters.', 55 | 'array' => 'The :attribute must have at least :min items.', 56 | ], 57 | 'not_in' => 'The selected :attribute is invalid.', 58 | 'numeric' => 'The :attribute must be a number.', 59 | 'regex' => 'The :attribute format is invalid.', 60 | 'required' => 'The :attribute field is required.', 61 | 'required_if' => 'The :attribute field is required when :other is :value.', 62 | 'required_with' => 'The :attribute field is required when :values is present.', 63 | 'required_with_all' => 'The :attribute field is required when :values is present.', 64 | 'required_without' => 'The :attribute field is required when :values is not present.', 65 | 'required_without_all' => 'The :attribute field is required when none of :values are present.', 66 | 'same' => 'The :attribute and :other must match.', 67 | 'size' => [ 68 | 'numeric' => 'The :attribute must be :size.', 69 | 'file' => 'The :attribute must be :size kilobytes.', 70 | 'string' => 'The :attribute must be :size characters.', 71 | 'array' => 'The :attribute must contain :size items.', 72 | ], 73 | 'timezone' => 'The :attribute must be a valid zone.', 74 | 'unique' => 'The :attribute has already been taken.', 75 | 'url' => 'The :attribute format is invalid.', 76 | 77 | /* 78 | |-------------------------------------------------------------------------- 79 | | Custom Validation Language Lines 80 | |-------------------------------------------------------------------------- 81 | | 82 | | Here you may specify custom validation messages for attributes using the 83 | | convention "attribute.rule" to name the lines. This makes it quick to 84 | | specify a specific custom language line for a given attribute rule. 85 | | 86 | */ 87 | 88 | 'custom' => [ 89 | 'attribute-name' => [ 90 | 'rule-name' => 'custom-message', 91 | ], 92 | ], 93 | 94 | /* 95 | |-------------------------------------------------------------------------- 96 | | Custom Validation Attributes 97 | |-------------------------------------------------------------------------- 98 | | 99 | | The following language lines are used to swap attribute place-holders 100 | | with something more reader friendly such as E-Mail Address instead 101 | | of "email". This simply helps us make messages a little cleaner. 102 | | 103 | */ 104 | 105 | 'attributes' => [], 106 | 107 | ]; 108 | -------------------------------------------------------------------------------- /resources/views/errors/503.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Be right back. 5 | 6 | 7 | 8 | 39 | 40 | 41 |
42 |
43 |
Be right back.
44 |
45 |
46 | 47 | 48 | -------------------------------------------------------------------------------- /resources/views/home.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | Vue 14 | 15 | 16 | 17 | 18 | 19 | 20 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |
31 |
32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /resources/views/vendor/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/resources/views/vendor/.gitkeep -------------------------------------------------------------------------------- /server.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | $uri = urldecode( 11 | parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) 12 | ); 13 | 14 | // This file allows us to emulate Apache's "mod_rewrite" functionality from the 15 | // built-in PHP web server. This provides a convenient way to test a Laravel 16 | // application without having installed a "real" web server software here. 17 | if ($uri !== '/' and file_exists(__DIR__.'/public'.$uri)) { 18 | return false; 19 | } 20 | 21 | require_once __DIR__.'/public/index.php'; 22 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /storage/database.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuroski/Laravel-Vue-Boilerplate/69609a9aacab8874ae12d1ec57d1235117974fc2/storage/database.sqlite -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | config.php 2 | routes.php 3 | compiled.php 4 | services.json 5 | events.scanned.php 6 | routes.scanned.php 7 | down 8 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /tests/ExampleTest.php: -------------------------------------------------------------------------------- 1 | visit('/') 17 | ->see('Laravel 5'); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | make(Illuminate\Contracts\Console\Kernel::class)->bootstrap(); 22 | 23 | return $app; 24 | } 25 | } 26 | --------------------------------------------------------------------------------