├── .const.ini ├── .gitignore ├── CHANGELOG-1.1.md ├── CHANGELOG-1.2.md ├── CHANGELOG-1.3.md ├── LICENSE ├── README.md ├── UPGRADING.md ├── app ├── Core │ ├── Constants │ │ └── Services.php │ ├── Exceptions │ │ └── .gitkeep │ ├── Facades │ │ └── Example.php │ ├── Models │ │ └── User.php │ ├── Providers │ │ └── Example.php │ └── Services │ │ └── Example.php └── Kernels │ ├── Cli │ ├── Kernel.php │ └── Tasks │ │ └── ExampleTask.php │ ├── Http │ ├── Controllers │ │ ├── ControllerBase.php │ │ ├── ControllerJson.php │ │ ├── ErrorsController.php │ │ └── HomeController.php │ ├── Kernel.php │ ├── Middleware │ │ └── RedirectIfAuthenticated.php │ └── Modules │ │ ├── Backend │ │ ├── Controllers │ │ │ ├── ControllerBase.php │ │ │ └── IndexController.php │ │ └── Module.php │ │ └── Frontend │ │ ├── Controllers │ │ ├── AuthController.php │ │ ├── ControllerBase.php │ │ ├── IndexController.php │ │ └── ThrottledController.php │ │ └── Module.php │ └── Micro │ ├── Controllers │ └── MicroController.php │ └── Kernel.php ├── bootstrap ├── app.php ├── autoload.php └── compile │ └── .gitkeep ├── composer.json ├── config ├── app.php ├── assets.php ├── auth.php ├── cache.php ├── compile.php ├── database.php ├── error.php ├── log.php ├── migrations.php ├── session.php └── view.php ├── migrations ├── .gitkeep └── 2017_11_24_080000_create_users_table.php ├── phpunit.xml ├── public ├── .htaccess ├── app_dev.php ├── css │ ├── app.css │ ├── backend.css │ └── frontend.css ├── img │ └── nucleon.svg ├── index.php ├── js │ └── app.js └── micro.php ├── quark ├── resources ├── assets │ ├── .gitkeep │ ├── js │ │ └── app.js │ └── sass │ │ ├── app │ │ ├── _variables.scss │ │ └── app.scss │ │ ├── backend │ │ └── backend.scss │ │ ├── components │ │ ├── _flash.scss │ │ ├── _global.scss │ │ ├── _variables.scss │ │ └── materialize │ │ │ ├── components │ │ │ ├── _badges.scss │ │ │ ├── _buttons.scss │ │ │ ├── _cards.scss │ │ │ ├── _carousel.scss │ │ │ ├── _chips.scss │ │ │ ├── _collapsible.scss │ │ │ ├── _color-classes.scss │ │ │ ├── _color-variables.scss │ │ │ ├── _datepicker.scss │ │ │ ├── _dropdown.scss │ │ │ ├── _global.scss │ │ │ ├── _grid.scss │ │ │ ├── _icons-material-design.scss │ │ │ ├── _materialbox.scss │ │ │ ├── _modal.scss │ │ │ ├── _navbar.scss │ │ │ ├── _normalize.scss │ │ │ ├── _preloader.scss │ │ │ ├── _pulse.scss │ │ │ ├── _sidenav.scss │ │ │ ├── _slider.scss │ │ │ ├── _table_of_contents.scss │ │ │ ├── _tabs.scss │ │ │ ├── _tapTarget.scss │ │ │ ├── _timepicker.scss │ │ │ ├── _toast.scss │ │ │ ├── _tooltip.scss │ │ │ ├── _transitions.scss │ │ │ ├── _typography.scss │ │ │ ├── _variables.scss │ │ │ ├── _waves.scss │ │ │ └── forms │ │ │ │ ├── _checkboxes.scss │ │ │ │ ├── _file-input.scss │ │ │ │ ├── _forms.scss │ │ │ │ ├── _input-fields.scss │ │ │ │ ├── _radio-buttons.scss │ │ │ │ ├── _range.scss │ │ │ │ ├── _select.scss │ │ │ │ └── _switches.scss │ │ │ └── materialize.scss │ │ └── frontend │ │ └── frontend.scss └── views │ ├── back │ ├── index │ │ └── index.volt │ └── layouts │ │ └── template.volt │ ├── errors │ ├── http404.volt │ └── http5xx.volt │ ├── front │ ├── auth │ │ ├── login.volt │ │ └── register.volt │ ├── index │ │ └── index.volt │ └── layouts │ │ └── template.volt │ ├── home │ └── index.volt │ ├── layouts │ └── template.volt │ └── partials │ ├── flash.volt │ ├── footer.volt │ └── header.volt ├── routes ├── cli.php ├── http.php └── micro.php ├── storage ├── caches │ └── .gitignore ├── logs │ └── .gitignore └── views │ └── .gitignore └── tests ├── Test └── RoutesTest.php └── bootstrap.php /.const.ini: -------------------------------------------------------------------------------- 1 | [base] 2 | path = @php/dir 3 | 4 | [app] 5 | env = @php/env:APP_ENV:development 6 | debug = true 7 | 8 | url = http://127.0.0.1:8000 9 | static_url = http://127.0.0.1:8000 10 | 11 | key = YourSecretKey 12 | 13 | [db] 14 | host = 'localhost' 15 | user = 'root' 16 | password = 'abc123' 17 | name = 'nucleon' 18 | 19 | [cache] 20 | driver = file 21 | 22 | [session] 23 | id = nucleon-session-id 24 | driver = files 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | /.sass-cache 3 | /vendor 4 | composer.phar 5 | .php_cs.cache 6 | .DS_Store 7 | Thumbs.db 8 | -------------------------------------------------------------------------------- /CHANGELOG-1.1.md: -------------------------------------------------------------------------------- 1 | # Release Note 2 | 3 | ## v1.1.0 4 | 5 | ### Added 6 | - Migrations feature -------------------------------------------------------------------------------- /CHANGELOG-1.2.md: -------------------------------------------------------------------------------- 1 | # Release Note 2 | 3 | ## v1.2.0 4 | 5 | ### Added 6 | - View 7 | - Configuring extensions, filters and functions to add to the compiler 8 | - StrExtension : 9 | - Allow to call all Support\Str function in volt. 10 | Use `str_{name}` will generate `Neutrino\Support\Str::{name}`. 11 | - Add `slug` filter (call `Neutrino\Support\Str::slug`) 12 | - Add `limit` filter (call `Neutrino\Support\Str::limit`) 13 | - Add `words` filter (call `Neutrino\Support\Str::words`) 14 | - MergeFilter : 15 | - Add `merge` filter (call `array_merge`) 16 | - RoundFilter : 17 | - Add `round` filter (call `round` | `floor` | `ceil` [@see twig\round](https://twig.symfony.com/doc/2.x/filters/round.html)) 18 | - SliceFilter : 19 | - Add `slice` filter (call `array_slice`) 20 | - SplitFilter : 21 | - Add `split` filter (call `str_split` | `explode` [@see twig\split](https://twig.symfony.com/doc/2.x/filters/split.html)) 22 | - View engines : 23 | - Allow to configuring multiple engines. 24 | - Built-in Server 25 | - `php quark server:run` : run php built-in server 26 | - Assets 27 | - JS Compilation (via Closure API) 28 | - Sass Compilation (via sass) 29 | - Debug/Profiler toolbar feature 30 | - Debug VarDumd feature 31 | - use `Neutrino\Debug\VarDump::dump` 32 | - use in `.volt` `{{ dump(var) }}` 33 | -------------------------------------------------------------------------------- /CHANGELOG-1.3.md: -------------------------------------------------------------------------------- 1 | # Release Note 2 | 3 | ## v1.3.0 4 | 5 | ### Important 6 | - php support 5.6 - 7.2 7 | Phalcon v3.x will not support php7.3 and higher. 8 | Nucleon v1.x, will support only php5.6 to php7.2. 9 | Nucleon v2.x will support php7.2 and higher, with Phalcon v4.x. 10 | 11 | ### Added 12 | - Task RouteCache (route:cache) : Cache http route file 13 | - Task Optimization (optimize) : Add route:cache 14 | - Compile files (compile, const, config, loader), are now able to be commited & shared 15 | - Volt: Add csrf extension (csrf_field & csrf_token function) 16 | - Volt: Add route function 17 | - Config: Add : 18 | - app.static_uri: Define app static uri 19 | - app.key, app.cipher: Used for cookie encryption 20 | 21 | ### Changed 22 | - Rename Middleware\Guest to Middleware\RedirectIfAuthenticated. 23 | - Config::Session : Allow to describe multiple store for session -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Guillaume Allegret 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | Nucleon : Phalcon extended framework. (App) 4 | =========================================== 5 | [![Build Status](https://travis-ci.org/phalcon-nucleon/framework.svg?branch=master)](https://travis-ci.org/phalcon-nucleon/framework) 6 | 7 | # About 8 | Nucleon is a web application that uses [Phalcon](https://www.phalconphp.com/) 9 | . 10 | Our philosophy is to make the web faster, with enjoyable development. 11 | 12 | Nucleon, with [Phalcon](https://www.phalconphp.com/), attempts to take the pain out of development by easing common tasks used in the majority of web projects, such as: 13 | 14 | - [Simple, fast routing engine.](https://phalcon-nucleon.github.io/#!basics/routing.html) 15 | - [Powerful dependency injection container, and simple service registration.](https://phalcon-nucleon.github.io/#!architecture-concepts/dependency-injection.html) 16 | - Multiple back-ends for session and cache storage. 17 | - Database agnostic [schema migration](https://phalcon-nucleon.github.io/#!database/migrations.html). 18 | - [HMVC Structure](https://phalcon-nucleon.github.io/#!architecture-concepts/modules-concepts.html). 19 | - [Micro & Fullstack kernel](https://phalcon-nucleon.github.io/#!architecture-concepts/kernels-concepts.html). 20 | 21 | # Install 22 | ``` 23 | \> composer create-project nucleon/nucleon app-root 24 | ``` 25 | 26 | [Read installation documentation](https://phalcon-nucleon.github.io/#!getting-started/installation.html) 27 | 28 | # Require 29 | * PHP 5.6 - 7.2 _(>= 5.6 & <7.3)_ 30 | * Phalcon 3 _(~3.0)_ 31 | * ext-mbstring 32 | * ext-openssl 33 | 34 | # Composer & Autoloading 35 | Nucleon uses composer. So you can use all your libraries prefer as you wish! 36 | 37 | The `php quark optimize` command will optimize autoloading using the phalcon loader (best performing autoloader !) 38 | 39 | # Documentation 40 | [Read the full documentation](https://phalcon-nucleon.github.io) 41 | -------------------------------------------------------------------------------- /UPGRADING.md: -------------------------------------------------------------------------------- 1 | # UPGRADING 2 | 3 | ## 1.2 > 1.3 4 | 5 | ### Config 6 | You must modify all paths using "\_\_DIR__", so that it now uses "BASE_PATH". 7 | 8 | #### config/session.php 9 | Session define now multiple stores, and a default store. 10 | You should move your session config in store, add a set this store has default store. 11 | ```php 12 | SESSION_ID, 16 | 17 | 'adapter' => 'Files', 18 | ]; 19 | ``` 20 | 21 | ```php 22 | SESSION_ID, 26 | 27 | 'default' => 'files', 28 | 29 | 'stores' => [ 30 | 'files' => [ 31 | 'adapter' => 'Files' 32 | ] 33 | ] 34 | ]; 35 | ``` -------------------------------------------------------------------------------- /app/Core/Constants/Services.php: -------------------------------------------------------------------------------- 1 | setSource("users"); 57 | 58 | $this->primary('id', Column::TYPE_INTEGER); 59 | 60 | $this->column('name', Column::TYPE_VARCHAR); 61 | $this->column('email', Column::TYPE_VARCHAR); 62 | $this->column('password', Column::TYPE_VARCHAR); 63 | $this->column('remember_token', Column::TYPE_VARCHAR, [ 64 | 'nullable' => true, 65 | ]); 66 | $this->column('created_at', Column::TYPE_DATETIME, [ 67 | 'autoInsert' => true, 68 | ]); 69 | $this->column('updated_at', Column::TYPE_DATETIME, [ 70 | 'autoInsert' => true, 71 | 'autoUpdate' => true, 72 | ]); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /app/Core/Providers/Example.php: -------------------------------------------------------------------------------- 1 | 'service', 51 | * 'name' => 'cache' 52 | * ], 53 | * [ 54 | * 'type' => 'instance', 55 | * 'className' => MyClass::class 56 | * ], 57 | * [ 58 | * 'type' => 'parameter', 59 | * 'value' => true // false 60 | * ], 61 | * ] 62 | * 63 | * @var array 64 | */ 65 | protected $options; 66 | } 67 | -------------------------------------------------------------------------------- /app/Core/Services/Example.php: -------------------------------------------------------------------------------- 1 | getDI()->get(Services::LOGGER); 24 | 25 | $logger->debug('Something Appends !'); 26 | 27 | return 'abc'; 28 | } 29 | 30 | /** 31 | * @return string 32 | */ 33 | public function doAnotherThing() 34 | { 35 | // Use Facade 36 | Log::debug('Another thing Appends !'); 37 | 38 | return 'abc'; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/Kernels/Cli/Kernel.php: -------------------------------------------------------------------------------- 1 | php quark some 17 | */ 18 | public function mainAction() 19 | { 20 | $this->line(__METHOD__); 21 | } 22 | 23 | public function throwException() 24 | { 25 | throw new \Exception(); 26 | } 27 | 28 | /** 29 | * \> php quark some:test hello world 30 | * 31 | * @argument param_1: the first param 32 | * @argument param_2: the second param 33 | * 34 | * @param array $params 35 | */ 36 | public function testAction(array $params) 37 | { 38 | $this->line($this->output->notice(__METHOD__) . ' ' . Decorate::info(implode(' ', $params))); 39 | } 40 | 41 | /** 42 | * \> php quark show:up 43 | */ 44 | public function showupAction() 45 | { 46 | $this->line('Hi !'); 47 | $name = $this->prompt('I\'m quark ! And you, who you are ?'); 48 | 49 | $this->line('Nice to meet you ' . $name); 50 | 51 | if ($this->confirm('Are you humain ?', true)) { 52 | $this->info('Yes you are !'); 53 | 54 | switch ($this->choices('You are a male, a female, or just human ?', ['male', 'female', 'human'], 'human')) { 55 | case 'male': 56 | case 'female': 57 | $this->line('Ok'); 58 | break; 59 | case 'human': 60 | $this->line('Ok, i like your thinking way :)'); 61 | break; 62 | } 63 | } else { 64 | $this->info('Hey ! you like me'); 65 | } 66 | 67 | $this->line(''); 68 | $this->line('Well, by ' . $name); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /app/Kernels/Http/Controllers/ControllerBase.php: -------------------------------------------------------------------------------- 1 | view->setRenderLevel(View::LEVEL_ACTION_VIEW); 23 | } 24 | 25 | /* 26 | * Event called on controller construction 27 | * 28 | * Register middleware here. 29 | * 30 | protected function onConstruct() 31 | { 32 | ; 33 | } 34 | /**/ 35 | } 36 | -------------------------------------------------------------------------------- /app/Kernels/Http/Controllers/ControllerJson.php: -------------------------------------------------------------------------------- 1 | view->setRenderLevel(View::LEVEL_NO_RENDER); 18 | } 19 | 20 | /* 21 | * Event called on controller construction 22 | * 23 | * Register middleware here. 24 | * 25 | protected function onConstruct() 26 | { 27 | ; 28 | } 29 | /**/ 30 | } 31 | -------------------------------------------------------------------------------- /app/Kernels/Http/Controllers/ErrorsController.php: -------------------------------------------------------------------------------- 1 | response->setStatusCode(500, 'Internal Server Error'); 15 | 16 | return $this->view->render('errors', 'http5xx'); 17 | } 18 | 19 | public function http404Action() 20 | { 21 | $this->response->setStatusCode(404, 'Not Found'); 22 | 23 | return $this->view->render('errors', 'http404'); 24 | } 25 | 26 | public function throwExceptionAction() 27 | { 28 | $this->flash->success('success'); 29 | 30 | trigger_error('notice', E_USER_NOTICE); 31 | 32 | trigger_error('warning', E_USER_WARNING); 33 | 34 | try { 35 | throw new \Phalcon\Exception('A catched exception', 159); 36 | } catch (\Exception $e) { 37 | throw new \RuntimeException("that's a white rabbit", 0, $e); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/Kernels/Http/Controllers/HomeController.php: -------------------------------------------------------------------------------- 1 | view->render('home', 'index'); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/Kernels/Http/Kernel.php: -------------------------------------------------------------------------------- 1 | [ 92 | 'className' => FrontendModule::class, 93 | 'path' => BASE_PATH . '/app/Kernels/Http/Modules/Frontend/Module.php', 94 | ], 95 | 'Backend' => [ 96 | 'className' => BackendModule::class, 97 | 'path' => BASE_PATH . '/app/Kernels/Http/Modules/Backend/Module.php', 98 | ], 99 | ]; 100 | } 101 | -------------------------------------------------------------------------------- /app/Kernels/Http/Middleware/RedirectIfAuthenticated.php: -------------------------------------------------------------------------------- 1 | {Services::AUTH}->check()) { 29 | $this->response->redirect(''); 30 | 31 | return false; 32 | } 33 | 34 | return true; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/Kernels/Http/Modules/Backend/Controllers/ControllerBase.php: -------------------------------------------------------------------------------- 1 | view->setRenderLevel(View::LEVEL_ACTION_VIEW); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Kernels/Http/Modules/Backend/Controllers/IndexController.php: -------------------------------------------------------------------------------- 1 | view->render('back/index', 'index'); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/Kernels/Http/Modules/Backend/Module.php: -------------------------------------------------------------------------------- 1 | view->render('front/auth', 'register'); 24 | } 25 | 26 | /** 27 | * Register action. 28 | * 29 | * url (post) : /register 30 | */ 31 | public function postRegisterAction() 32 | { 33 | // Get the data from the user 34 | $email = $this->request->getPost('email'); 35 | $name = $this->request->getPost('name'); 36 | $password = $this->request->getPost('password'); 37 | $confirm = $this->request->getPost('confirm'); 38 | 39 | if ($password !== $confirm) { 40 | $this->flash->error('Password & confirm are different'); 41 | 42 | $this->dispatcher->forward([ 43 | 'controller' => 'auth', 44 | 'action' => 'register', 45 | ]); 46 | 47 | return; 48 | } 49 | 50 | /** @var \App\Core\Models\User $userClass */ 51 | $userClass = $this->config->auth->model; 52 | 53 | $user = $userClass::findFirst([ 54 | $userClass::getAuthIdentifierName() . ' = :auth_identifier:', 55 | 'bind' => [ 56 | 'auth_identifier' => $email, 57 | ], 58 | ]); 59 | 60 | if (!empty($user)) { 61 | $this->flash->error('User already exist'); 62 | 63 | $this->dispatcher->forward([ 64 | 'controller' => 'auth', 65 | 'action' => 'register', 66 | ]); 67 | 68 | return; 69 | } 70 | 71 | /** @var \App\Core\Models\User $user */ 72 | $user = new $userClass; 73 | 74 | $user->name = $name; 75 | $user->{$userClass::getAuthIdentifierName()} = $email; 76 | $user->{$userClass::getAuthPasswordName()} = $this->security->hash($password); 77 | 78 | if ($user->save() === false) { 79 | $messages = array_merge(['Failed save user.'], $user->getMessages()); 80 | 81 | $this->flash->error(implode(' - ', $messages)); 82 | 83 | $this->dispatcher->forward([ 84 | 'controller' => 'auth', 85 | 'action' => 'register', 86 | ]); 87 | 88 | return; 89 | } 90 | 91 | $this->flashSession->success('User create successful !'); 92 | 93 | $this->response->redirect('index'); 94 | $this->view->disable(); 95 | 96 | return; 97 | } 98 | 99 | /** 100 | * Login view. 101 | * 102 | * url (get) : /login 103 | */ 104 | public function loginAction() 105 | { 106 | $this->view->render('front/auth', 'login'); 107 | } 108 | 109 | /** 110 | * Login action. 111 | * 112 | * url (post) : /login 113 | */ 114 | public function postLoginAction() 115 | { 116 | // Get the data from the user 117 | $email = $this->request->getPost('email'); 118 | $password = $this->request->getPost('password'); 119 | 120 | $user = $this->auth->attempt([ 121 | 'email' => $email, 122 | 'password' => $password, 123 | ]); 124 | 125 | if (is_null($user)) { 126 | $this->flash->error('Wrong email/password'); 127 | 128 | // Forward to the login form again 129 | $this->dispatcher->forward([ 130 | 'controller' => 'auth', 131 | 'action' => 'login', 132 | ]); 133 | 134 | return; 135 | } 136 | 137 | $this->flashSession->success('Welcome ' . $user->name); 138 | 139 | // Forward to the 'invoices' controller if the user is valid 140 | $this->response->redirect('index'); 141 | $this->view->disable(); 142 | 143 | return; 144 | } 145 | 146 | /** 147 | * Logout action. 148 | * 149 | * url (get) : /logout 150 | */ 151 | public function logoutAction() 152 | { 153 | $this->auth->logout(); 154 | 155 | $this->response->redirect('index'); 156 | $this->view->disable(); 157 | 158 | return; 159 | } 160 | } 161 | -------------------------------------------------------------------------------- /app/Kernels/Http/Modules/Frontend/Controllers/ControllerBase.php: -------------------------------------------------------------------------------- 1 | view->setRenderLevel(View::LEVEL_ACTION_VIEW); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Kernels/Http/Modules/Frontend/Controllers/IndexController.php: -------------------------------------------------------------------------------- 1 | view->render('front/index', 'index'); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/Kernels/Http/Modules/Frontend/Controllers/ThrottledController.php: -------------------------------------------------------------------------------- 1 | middleware(ThrottleRequest::class, [60, 60]); 20 | } 21 | 22 | public function indexAction() 23 | { 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Kernels/Http/Modules/Frontend/Module.php: -------------------------------------------------------------------------------- 1 | response->setStatusCode(200); 12 | 13 | $this->response->setJsonContent(['action' => 'index']); 14 | 15 | return $this->response; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/Kernels/Micro/Kernel.php: -------------------------------------------------------------------------------- 1 | APP_URL . '/', 13 | 14 | /* 15 | +--------------------------------------------------------------- 16 | | Application static uri 17 | +--------------------------------------------------------------- 18 | | 19 | | This value is used by assets manager. 20 | | It allow to specify a different domain for static 21 | | resource (like a cdn). 22 | */ 23 | 'static_base_uri' => APP_STATIC_URL . '/', 24 | 25 | /* 26 | +-------------------------------------------------------------------------- 27 | | Encryption Key 28 | +-------------------------------------------------------------------------- 29 | | 30 | | This key is used by the Phalcon encrypter service and should be set 31 | | to a random, 32 character string, otherwise these encrypted strings 32 | | will not be safe. Please do this before deploying an application! 33 | */ 34 | 'key' => APP_KEY, 35 | 36 | /* 37 | +-------------------------------------------------------------------------- 38 | | Encryption Algorithm 39 | +-------------------------------------------------------------------------- 40 | | The `aes-256-gcm' is the preferable cipher, but it is not usable until 41 | | the openssl library is upgraded, which is available in PHP 7.1. 42 | | 43 | | The `aes-256-ctr' is arguably the best choice for cipher 44 | | algorithm in these days. 45 | */ 46 | 'cipher' => 'aes-256-ctr' 47 | ]; -------------------------------------------------------------------------------- /config/assets.php: -------------------------------------------------------------------------------- 1 | [ 5 | /* 6 | +--------------------------------------------------------------- 7 | | Sass files 8 | +--------------------------------------------------------------- 9 | | {src file} => {dest file} 10 | | 11 | */ 12 | 'files' => [ 13 | 'resources/assets/sass/app/app.scss' => 'public/css/app.css', 14 | 'resources/assets/sass/frontend/frontend.scss' => 'public/css/frontend.css', 15 | 'resources/assets/sass/backend/backend.scss' => 'public/css/backend.css', 16 | ], 17 | /* 18 | +--------------------------------------------------------------- 19 | | Sass Options 20 | +--------------------------------------------------------------- 21 | | 22 | */ 23 | 'options' => [ 24 | /* 25 | +--------------------------------------------------------------- 26 | | Output style 27 | +--------------------------------------------------------------- 28 | | compressed, compact, nested, expanded 29 | */ 30 | 'style' => 'compressed', 31 | /* 32 | +--------------------------------------------------------------- 33 | | Sourcemap 34 | +--------------------------------------------------------------- 35 | | none, inline 36 | */ 37 | 'sourcemap' => 'none' 38 | ] 39 | ], 40 | 'js' => [ 41 | /* 42 | +--------------------------------------------------------------- 43 | | Compilation - Closure Compiler Options 44 | +--------------------------------------------------------------- 45 | | https://developers.google.com/closure/compiler/docs/api-ref 46 | | 47 | */ 48 | 'compile' => [ 49 | /* 50 | +--------------------------------------------------------------- 51 | | Directories to compile 52 | +--------------------------------------------------------------- 53 | | 54 | */ 55 | 'directories' => [ 56 | 'resources/assets/js' 57 | ], 58 | /* 59 | +--------------------------------------------------------------- 60 | | Compilation level 61 | +--------------------------------------------------------------- 62 | | WHITESPACE_ONLY 63 | | SIMPLE_OPTIMIZATIONS 64 | | ADVANCED_OPTIMIZATIONS 65 | */ 66 | 'level' => 'ADVANCED_OPTIMIZATIONS', 67 | /* 68 | +--------------------------------------------------------------- 69 | | Externs libraries. 70 | +--------------------------------------------------------------- 71 | | Note : not added to output file. 72 | */ 73 | 'externs_url' => [ 74 | 'http://code.jquery.com/jquery-3.3.1.js', 75 | 'https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-beta/js/materialize.js', 76 | ] 77 | ], 78 | /* 79 | +--------------------------------------------------------------- 80 | | Pre-Compilation - Speedhack 81 | +--------------------------------------------------------------- 82 | | Apply before call closure compiler 83 | | 84 | */ 85 | 'precompilations' => [ 86 | /* 87 | +--------------------------------------------------------------- 88 | | jQuery id selector speedhack 89 | +--------------------------------------------------------------- 90 | | Increase performance of jQuery id selector 91 | | Add function : 92 | | function jQuerySelectorSpeedhack(id){return $(document.getElementById(id))} 93 | | 94 | | Replace : 95 | | $('#someid') > jQuerySelectorSpeedhack('someid') 96 | | $('#someid .test') > jQuerySelectorSpeedhack('someid').find('.test') 97 | | 98 | */ 99 | \Neutrino\Assets\Closure\JqueryIdPrecompilation::class, 100 | /* 101 | +--------------------------------------------------------------- 102 | | Enable or disable debug function. 103 | +--------------------------------------------------------------- 104 | | Add function (in debug) : 105 | | function debug(){console.log.apply(console, arguments)} 106 | | 107 | | Closure compiler (with ADVANCED_OPTIMIZATIONS) will remove all 108 | | debug call, when debug is disable. 109 | | 110 | */ 111 | \Neutrino\Assets\Closure\DebugPrecompilation::class => [ 112 | 'debug' => APP_DEBUG 113 | ], 114 | /* 115 | +--------------------------------------------------------------- 116 | | Wrap all file in a global closure 117 | +--------------------------------------------------------------- 118 | | Closure compiler (with ADVANCED_OPTIMIZATIONS) will remove all 119 | | debug call, when debug is disable. 120 | | 121 | */ 122 | \Neutrino\Assets\Closure\GlobalClosurePrecompilation::class => [ 123 | 'window' => 'window', 124 | 'document' => 'document', 125 | 'jQuery' => 'jQuery', 126 | 'Materialize' => 'Materialize', 127 | ] 128 | ], 129 | /* 130 | +--------------------------------------------------------------- 131 | | Output file 132 | +--------------------------------------------------------------- 133 | | 134 | */ 135 | 'output_file' => 'public/js/app.js' 136 | ] 137 | ]; 138 | -------------------------------------------------------------------------------- /config/auth.php: -------------------------------------------------------------------------------- 1 | \App\Core\Models\User::class, 12 | ]; -------------------------------------------------------------------------------- /config/cache.php: -------------------------------------------------------------------------------- 1 | CACHE_DRIVER, 53 | 'stores' => [ 54 | 'file' => [ 55 | 'driver' => 'File', 56 | 'adapter' => 'Data', 57 | 'options' => ['cacheDir' => BASE_PATH . '/storage/caches/'], 58 | ], 59 | 60 | /* 61 | +--------------------------------------------------------------- 62 | | Libmemcached Adapter - Example 63 | +--------------------------------------------------------------- 64 | * 65 | 'memcache' => [ 66 | 'driver' => 'Libmemcached', 67 | 'adapter' => 'None', 68 | 'options' => [ 69 | 'servers' => [ 70 | [ 71 | 'host' => '127.0.0.1', 72 | 'port' => 11211, 73 | 'weight' => 0, 74 | ], 75 | ], 76 | ], 77 | ], 78 | /**/ 79 | 80 | /* 81 | +--------------------------------------------------------------- 82 | | Redis Adapter - Example 83 | +--------------------------------------------------------------- 84 | * 85 | 'redis' => [ 86 | 'driver' => 'Redis', 87 | 'adapter' => 'Data', 88 | 'options' => [ 89 | 'host' => REDIS_HOST, 90 | 'user' => REDIS_USER, 91 | 'port' => REDIS_PORT, 92 | "auth" => REDIS_PASSWORD, 93 | "index" => 0, 94 | ], 95 | ], 96 | /**/ 97 | ], 98 | ]; 99 | -------------------------------------------------------------------------------- /config/compile.php: -------------------------------------------------------------------------------- 1 | 'mysql', 28 | 'connections' => [ 29 | 'mysql' => [ 30 | 'adapter' => \Phalcon\Db\Adapter\Pdo\Mysql::class, 31 | 'config' => [ 32 | 'host' => DB_HOST, 33 | 'username' => DB_USER, 34 | 'password' => DB_PASSWORD, 35 | 'dbname' => DB_NAME, 36 | 'charset' => 'utf8', 37 | ] 38 | ] 39 | ], 40 | ]; 41 | -------------------------------------------------------------------------------- /config/error.php: -------------------------------------------------------------------------------- 1 | [ 12 | 'formatter' => \Phalcon\Logger\Formatter\Line::class, 13 | 'format' => '[%date%][%type%] %message%', 14 | 'dateFormat' => 'Y-m-d H:i:s O' 15 | ], 16 | 'dispatcher' => [ 17 | 'namespace' => 'App\Kernels\Http\Controllers', 18 | 'controller' => 'errors', 19 | 'action' => 'index', 20 | ], 21 | 'view' => [ 22 | 'path' => 'errors', 23 | 'file' => 'http5xx' 24 | ] 25 | ]; -------------------------------------------------------------------------------- /config/log.php: -------------------------------------------------------------------------------- 1 | 'File', 27 | 'path' => BASE_PATH . '/storage/logs/nucleon.log', 28 | 'options' => [] 29 | ]; 30 | -------------------------------------------------------------------------------- /config/migrations.php: -------------------------------------------------------------------------------- 1 | Migrations\Storage\DatabaseStorage::class, 7 | 'prefix' => Migrations\Prefix\DatePrefix::class, 8 | 'path' => BASE_PATH . '/migrations', 9 | ]; -------------------------------------------------------------------------------- /config/session.php: -------------------------------------------------------------------------------- 1 | SESSION_ID, 10 | 11 | 'default' => SESSION_DRIVER, 12 | 13 | 'stores' => [ 14 | /* 15 | +--------------------------------------------------------------- 16 | | Session Adapter 17 | +--------------------------------------------------------------- 18 | | 19 | | This value define the session adapter 20 | | 21 | | Available Session Adapter : 22 | | \Phalcon\Session\Adapter\Files 23 | | \Phalcon\Session\Adapter\Libmemcached 24 | | \Phalcon\Session\Adapter\Memcache 25 | | \Phalcon\Session\Adapter\Redis 26 | | 27 | | (phalcon/incubator) 28 | | \Phalcon\Session\Adapter\Aerospike 29 | | \Phalcon\Session\Adapter\Database 30 | | \Phalcon\Session\Adapter\HandlerSocket 31 | | \Phalcon\Session\Adapter\Mongo 32 | */ 33 | 34 | /* 35 | +--------------------------------------------------------------- 36 | | Files Adapter 37 | +--------------------------------------------------------------- 38 | */ 39 | 'files' => [ 40 | 'adapter' => \Phalcon\Session\Adapter\Files::class, 41 | 'options' => [ 42 | 'uniqueId' => SESSION_ID 43 | ] 44 | ], 45 | /**/ 46 | 47 | /* 48 | +--------------------------------------------------------------- 49 | | Memcached Adapter - Example 50 | +--------------------------------------------------------------- 51 | * 52 | 'memcached' => [ 53 | 'adapter' => \Phalcon\Session\Adapter\Libmemcached::class, 54 | 'options' => [ 55 | 'servers' => [ 56 | [ 57 | 'host' => '127.0.0.1', 58 | 'port' => 11211, 59 | 'weight' => 0, 60 | ] 61 | ], 62 | 'client' => [ 63 | \Memcached::OPT_HASH => \Memcached::HASH_MD5, 64 | ], 65 | 'lifetime' => 3600, 66 | 'prefix' => 'app_session_', 67 | ] 68 | ], 69 | /**/ 70 | 71 | /* 72 | +--------------------------------------------------------------- 73 | | Redis Adapter - Example 74 | +--------------------------------------------------------------- 75 | * 76 | 'redis' => [ 77 | 'adapter' => \Phalcon\Session\Adapter\Redis::class, 78 | 'options' => [ 79 | 'uniqueId' => SESSION_ID, 80 | 'host' => 'localhost', 81 | 'port' => 6379, 82 | 'auth' => 'redis_auth', 83 | 'persistent' => false, 84 | 'lifetime' => 3600, 85 | 'prefix' => 'app_session_', 86 | 'index' => 1, 87 | ] 88 | ], 89 | /**/ 90 | ] 91 | ]; -------------------------------------------------------------------------------- /config/view.php: -------------------------------------------------------------------------------- 1 | BASE_PATH . '/resources/views/', 19 | /* 20 | +--------------------------------------------------------------- 21 | | partial_dir 22 | +--------------------------------------------------------------- 23 | | 24 | | Relative path from view_dir to partials directory 25 | */ 26 | 'partials_dir' => null /* 'partials/' */, 27 | /* 28 | +--------------------------------------------------------------- 29 | | layout_dir 30 | +--------------------------------------------------------------- 31 | | 32 | | Relative path from view_dir to layouts directory 33 | */ 34 | 'layouts_dir' => null /* 'layouts/' */, 35 | /* 36 | +--------------------------------------------------------------- 37 | | compiled_path 38 | +--------------------------------------------------------------- 39 | | 40 | | This value define the store of compiled view 41 | */ 42 | 'compiled_path' => BASE_PATH . '/storage/views/', 43 | /* 44 | +--------------------------------------------------------------- 45 | | implicit 46 | +--------------------------------------------------------------- 47 | | 48 | | This value define if your application 49 | | should use implicit view. 50 | | Default : false, no implicit view 51 | */ 52 | 'implicit' => false, 53 | 54 | /* 55 | +--------------------------------------------------------------- 56 | | Engines 57 | +--------------------------------------------------------------- 58 | | 59 | | This value define the engines to use for generate templates 60 | */ 61 | 'engines' => [ 62 | '.volt' => Volt\VoltEngineRegister::class, 63 | ], 64 | 65 | /* 66 | +--------------------------------------------------------------- 67 | | Extensions 68 | +--------------------------------------------------------------- 69 | | 70 | | This value define the extensions to add to the volt compiler 71 | */ 72 | 'extensions' => [ 73 | /* 74 | +--------------------------------------------------------------- 75 | | Php Functions 76 | +--------------------------------------------------------------- 77 | | 78 | | Allow to use all php functions in volt. 79 | */ 80 | Volt\Compiler\Extensions\PhpFunctionExtension::class, 81 | /* 82 | +--------------------------------------------------------------- 83 | | Str Functions 84 | +--------------------------------------------------------------- 85 | | 86 | | Allow to use all Neutrino\Support\Str functions in volt. 87 | | 88 | | Add slug, limits & word filters 89 | */ 90 | Volt\Compiler\Extensions\StrExtension::class, 91 | /* 92 | +--------------------------------------------------------------- 93 | | Csrf Functions 94 | +--------------------------------------------------------------- 95 | | 96 | | Add CSRF functions. 97 | | csrf_field() : Generate the csrf field 98 | | csrf_key() : Get the CSRF key 99 | | csrf_token() : Get the CSRF token 100 | */ 101 | Volt\Compiler\Extensions\CsrfExtension::class, 102 | ], 103 | 104 | /* 105 | +--------------------------------------------------------------- 106 | | Filters 107 | +--------------------------------------------------------------- 108 | | 109 | | This value define the filters to add to the volt compiler 110 | */ 111 | 'filters' => [ 112 | 'round' => Volt\Compiler\Filters\RoundFilter::class, 113 | 'merge' => Volt\Compiler\Filters\MergeFilter::class, 114 | 'split' => Volt\Compiler\Filters\SplitFilter::class, 115 | 'slice' => Volt\Compiler\Filters\SliceFilter::class, 116 | ], 117 | 118 | /* 119 | +--------------------------------------------------------------- 120 | | Functions 121 | +--------------------------------------------------------------- 122 | | 123 | | This value define the functions to add to the volt compiler 124 | */ 125 | 'functions' => [ 126 | 'route' => Volt\Compiler\Functions\RouteFunction::class 127 | ], 128 | ]; 129 | -------------------------------------------------------------------------------- /migrations/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phalcon-nucleon/nucleon/e0cdff3514bee5a6f8ebbb0c1a22e6c13398583f/migrations/.gitkeep -------------------------------------------------------------------------------- /migrations/2017_11_24_080000_create_users_table.php: -------------------------------------------------------------------------------- 1 | create('users', function (Blueprint $table) { 19 | $table->increments('id')->primary(); 20 | $table->string('name'); 21 | $table->string('email')->unique(); 22 | $table->string('password'); 23 | $table->rememberToken(); 24 | $table->timestamps(); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @param \Neutrino\Database\Schema\Builder $schema 32 | * 33 | * @return void 34 | */ 35 | public function down(Builder $schema) 36 | { 37 | $schema->dropIfExists('users'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | ./tests/ 15 | 16 | 17 | 18 | ./app 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | AddDefaultCharset UTF-8 2 | 3 | 4 | RewriteEngine On 5 | RewriteCond %{REQUEST_FILENAME} !-d 6 | RewriteCond %{REQUEST_FILENAME} !-f 7 | RewriteRule ^/?api/(.*)$ /micro.php [QSA,L] 8 | 9 | RewriteCond %{REQUEST_FILENAME} !-d 10 | RewriteCond %{REQUEST_FILENAME} !-f 11 | RewriteRule ^(.*)$ /index.php [QSA,L] 12 | 13 | -------------------------------------------------------------------------------- /public/app_dev.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | make(App\Kernels\Http\Kernel::class); 12 | 13 | /** 14 | * Run kernel 15 | */ 16 | $bootstrap->run($kernel); 17 | -------------------------------------------------------------------------------- /public/js/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phalcon-nucleon/nucleon/e0cdff3514bee5a6f8ebbb0c1a22e6c13398583f/public/js/app.js -------------------------------------------------------------------------------- /public/micro.php: -------------------------------------------------------------------------------- 1 | make(\App\Kernels\Micro\Kernel::class); 11 | 12 | /** 13 | * Run kernel 14 | */ 15 | $bootstrap->run($kernel); -------------------------------------------------------------------------------- /quark: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | make(App\Kernels\Cli\Kernel::class); 13 | 14 | /** 15 | * Parse the arguments pass to the cli 16 | */ 17 | $kernel->setArgument($argv); 18 | 19 | /** 20 | * Run kernel 21 | */ 22 | $bootstrap->run($kernel); 23 | -------------------------------------------------------------------------------- /resources/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phalcon-nucleon/nucleon/e0cdff3514bee5a6f8ebbb0c1a22e6c13398583f/resources/assets/.gitkeep -------------------------------------------------------------------------------- /resources/assets/js/app.js: -------------------------------------------------------------------------------- 1 | (function (window, document, $) { 2 | // App main code 3 | })(window, document, jQuery); 4 | -------------------------------------------------------------------------------- /resources/assets/sass/app/_variables.scss: -------------------------------------------------------------------------------- 1 | $primary-color: #35393b; 2 | $body-font-color: #212121; 3 | 4 | $navbar-height: 48px; 5 | $footer-height: 36px; 6 | -------------------------------------------------------------------------------- /resources/assets/sass/app/app.scss: -------------------------------------------------------------------------------- 1 | @import "variables"; 2 | 3 | @import "../components/global"; 4 | -------------------------------------------------------------------------------- /resources/assets/sass/backend/backend.scss: -------------------------------------------------------------------------------- 1 | @import "../components/materialize/components/color-variables"; 2 | 3 | body{ 4 | background-color: color("grey", "darken-4"); 5 | color:color("grey", "lighten-5"); 6 | } 7 | nav{ 8 | background-color: color("grey", "darken-4"); 9 | } -------------------------------------------------------------------------------- /resources/assets/sass/components/_flash.scss: -------------------------------------------------------------------------------- 1 | .flash { 2 | > div { 3 | font-size: 1em; 4 | padding: 10px 15px; 5 | margin-bottom: 10px; 6 | } 7 | .errorMessage { 8 | @extend .red, .accent-1, .grey-text, .text-darken-3; 9 | } 10 | .warningMessage { 11 | @extend .orange, .accent-1, .grey-text, .text-darken-3; 12 | } 13 | .noticeMessage { 14 | @extend .light-blue, .accent-1, .grey-text, .text-darken-3; 15 | } 16 | .successMessage { 17 | @extend .light-green, .accent-1, .grey-text, .text-darken-3; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /resources/assets/sass/components/_global.scss: -------------------------------------------------------------------------------- 1 | @import "variables"; 2 | 3 | @import "../components/materialize/materialize"; 4 | 5 | @import "flash"; 6 | 7 | body { 8 | background-color: $body-bg-color; 9 | color: $body-font-color; 10 | font-family: 'Raleway', sans-serif; 11 | font-weight: 300; 12 | min-height: 100vh; 13 | margin: 0; 14 | 15 | nav, header { 16 | box-shadow: none; 17 | 18 | height: $navbar-height; 19 | line-height: $navbar-height; 20 | 21 | text-align: right; 22 | 23 | a { 24 | padding: 0 25px; 25 | font-size: 12px; 26 | font-weight: 600; 27 | letter-spacing: .1rem; 28 | text-decoration: none; 29 | text-transform: uppercase; 30 | } 31 | } 32 | 33 | footer { 34 | @extend .page-footer; 35 | 36 | height: $footer-height; 37 | line-height: $footer-height; 38 | 39 | padding: 0; 40 | 41 | text-align: right; 42 | 43 | span { 44 | padding: 0 25px; 45 | font-size: 12px; 46 | font-weight: 600; 47 | letter-spacing: .1rem; 48 | } 49 | } 50 | 51 | .page-content { 52 | min-height: calc(100vh - #{$navbar-height} - #{$footer-height}); 53 | display: flex; 54 | flex-shrink: 0; 55 | 56 | &.h-center { 57 | justify-content: center; 58 | } 59 | &.v-center { 60 | align-items: center; 61 | } 62 | 63 | .logo{ 64 | display: block; 65 | margin: auto; 66 | max-width: 96px; 67 | max-height: 96px; 68 | } 69 | 70 | .title { 71 | font-weight: 100; 72 | font-size: 84px; 73 | margin-bottom: 30px; 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /resources/assets/sass/components/_variables.scss: -------------------------------------------------------------------------------- 1 | $body-bg-color: white !default; 2 | $body-font-color: invert($body-bg-color) !default; 3 | $roboto-font-path: "https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/fonts/roboto/"; 4 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_badges.scss: -------------------------------------------------------------------------------- 1 | // Badges 2 | span.badge { 3 | min-width: 3rem; 4 | padding: 0 6px; 5 | margin-left: 14px; 6 | text-align: center; 7 | font-size: 1rem; 8 | line-height: $badge-height; 9 | height: $badge-height; 10 | color: color('grey', 'darken-1'); 11 | float: right; 12 | box-sizing: border-box; 13 | 14 | &.new { 15 | font-weight: 300; 16 | font-size: 0.8rem; 17 | color: #fff; 18 | background-color: $badge-bg-color; 19 | border-radius: 2px; 20 | } 21 | &.new:after { 22 | content: " new"; 23 | } 24 | 25 | &[data-badge-caption]::after { 26 | content: " " attr(data-badge-caption); 27 | } 28 | } 29 | 30 | // Special cases 31 | nav ul a span.badge { 32 | display: inline-block; 33 | float: none; 34 | margin-left: 4px; 35 | line-height: $badge-height; 36 | height: $badge-height; 37 | -webkit-font-smoothing: auto; 38 | } 39 | 40 | // Line height centering 41 | .collection-item span.badge { 42 | margin-top: calc(#{$collection-line-height / 2} - #{$badge-height / 2}); 43 | } 44 | .collapsible span.badge { 45 | margin-left: auto; 46 | } 47 | .sidenav span.badge { 48 | margin-top: calc(#{$sidenav-line-height / 2} - #{$badge-height / 2}); 49 | } 50 | 51 | table span.badge { 52 | display: inline-block; 53 | float: none; 54 | margin-left: auto; 55 | } 56 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_buttons.scss: -------------------------------------------------------------------------------- 1 | // shared styles 2 | .btn, 3 | .btn-flat { 4 | border: $button-border; 5 | border-radius: $button-radius; 6 | display: inline-block; 7 | height: $button-height; 8 | line-height: $button-height; 9 | padding: $button-padding; 10 | text-transform: uppercase; 11 | vertical-align: middle; 12 | -webkit-tap-highlight-color: transparent; // Gets rid of tap active state 13 | } 14 | 15 | // Disabled shared style 16 | .btn.disabled, 17 | .btn-floating.disabled, 18 | .btn-large.disabled, 19 | .btn-small.disabled, 20 | .btn-flat.disabled, 21 | .btn:disabled, 22 | .btn-floating:disabled, 23 | .btn-large:disabled, 24 | .btn-small:disabled, 25 | .btn-flat:disabled, 26 | .btn[disabled], 27 | .btn-floating[disabled], 28 | .btn-large[disabled], 29 | .btn-small[disabled], 30 | .btn-flat[disabled] { 31 | pointer-events: none; 32 | background-color: $button-disabled-background !important; 33 | box-shadow: none; 34 | color: $button-disabled-color !important; 35 | cursor: default; 36 | &:hover { 37 | background-color: $button-disabled-background !important; 38 | color: $button-disabled-color !important; 39 | } 40 | } 41 | 42 | // Shared icon styles 43 | .btn, 44 | .btn-floating, 45 | .btn-large, 46 | .btn-small, 47 | .btn-flat { 48 | font-size: $button-font-size; 49 | outline: 0; 50 | i { 51 | font-size: $button-icon-font-size; 52 | line-height: inherit; 53 | } 54 | } 55 | 56 | // Shared focus button style 57 | .btn, 58 | .btn-floating { 59 | &:focus { 60 | background-color: darken($button-raised-background, 10%); 61 | } 62 | } 63 | 64 | // Raised Button 65 | .btn { 66 | text-decoration: none; 67 | color: $button-raised-color; 68 | background-color: $button-raised-background; 69 | text-align: center; 70 | letter-spacing: .5px; 71 | @extend .z-depth-1; 72 | transition: background-color .2s ease-out; 73 | cursor: pointer; 74 | &:hover { 75 | background-color: $button-raised-background-hover; 76 | @extend .z-depth-1-half; 77 | } 78 | } 79 | 80 | // Floating button 81 | .btn-floating { 82 | &:hover { 83 | background-color: $button-floating-background-hover; 84 | @extend .z-depth-1-half; 85 | } 86 | &:before { 87 | border-radius: 0; 88 | } 89 | &.btn-large { 90 | &.halfway-fab { 91 | bottom: -$button-floating-large-size / 2; 92 | } 93 | width: $button-floating-large-size; 94 | height: $button-floating-large-size; 95 | padding: 0; 96 | i { 97 | line-height: $button-floating-large-size; 98 | } 99 | } 100 | 101 | &.btn-small { 102 | &.halfway-fab { 103 | bottom: -$button-floating-small-size / 2; 104 | } 105 | width: $button-floating-small-size; 106 | height: $button-floating-small-size; 107 | i { 108 | line-height: $button-floating-small-size; 109 | } 110 | } 111 | 112 | &.halfway-fab { 113 | &.left { 114 | right: auto; 115 | left: 24px; 116 | } 117 | position: absolute; 118 | right: 24px; 119 | bottom: -$button-floating-size / 2; 120 | } 121 | display: inline-block; 122 | color: $button-floating-color; 123 | position: relative; 124 | overflow: hidden; 125 | z-index: 1; 126 | width: $button-floating-size; 127 | height: $button-floating-size; 128 | line-height: $button-floating-size; 129 | padding: 0; 130 | background-color: $button-floating-background; 131 | border-radius: $button-floating-radius; 132 | @extend .z-depth-1; 133 | transition: background-color .3s; 134 | cursor: pointer; 135 | vertical-align: middle; 136 | i { 137 | width: inherit; 138 | display: inline-block; 139 | text-align: center; 140 | color: $button-floating-color; 141 | font-size: $button-large-icon-font-size; 142 | line-height: $button-floating-size; 143 | } 144 | } 145 | 146 | // button fix 147 | button.btn-floating { 148 | border: $button-border; 149 | } 150 | 151 | // Fixed Action Button 152 | .fixed-action-btn { 153 | &.active { 154 | ul { 155 | visibility: visible; 156 | } 157 | } 158 | 159 | // Directions 160 | &.direction-left, 161 | &.direction-right { 162 | padding: 0 0 0 15px; 163 | ul { 164 | text-align: right; 165 | right: 64px; 166 | top: 50%; 167 | transform: translateY(-50%); 168 | height: 100%; 169 | left: auto; 170 | /*width 100% only goes to width of button container */ 171 | width: 500px; 172 | li { 173 | display: inline-block; 174 | margin: 7.5px 15px 0 0; 175 | } 176 | } 177 | } 178 | &.direction-right { 179 | padding: 0 15px 0 0; 180 | ul { 181 | text-align: left; 182 | direction: rtl; 183 | left: 64px; 184 | right: auto; 185 | li { 186 | margin: 7.5px 0 0 15px; 187 | } 188 | } 189 | } 190 | &.direction-bottom { 191 | padding: 0 0 15px 0; 192 | ul { 193 | top: 64px; 194 | bottom: auto; 195 | display: flex; 196 | flex-direction: column-reverse; 197 | li { 198 | margin: 15px 0 0 0; 199 | } 200 | } 201 | } 202 | &.toolbar { 203 | &.active { 204 | &>a i { 205 | opacity: 0; 206 | } 207 | } 208 | padding: 0; 209 | height: $button-floating-large-size; 210 | ul { 211 | display: flex; 212 | top: 0; 213 | bottom: 0; 214 | z-index: 1; 215 | li { 216 | flex: 1; 217 | display: inline-block; 218 | margin: 0; 219 | height: 100%; 220 | transition: none; 221 | a { 222 | display: block; 223 | overflow: hidden; 224 | position: relative; 225 | width: 100%; 226 | height: 100%; 227 | background-color: transparent; 228 | box-shadow: none; 229 | color: #fff; 230 | line-height: $button-floating-large-size; 231 | z-index: 1; 232 | i { 233 | line-height: inherit; 234 | } 235 | } 236 | } 237 | } 238 | } 239 | position: fixed; 240 | right: 23px; 241 | bottom: 23px; 242 | padding-top: 15px; 243 | margin-bottom: 0; 244 | z-index: 997; 245 | ul { 246 | left: 0; 247 | right: 0; 248 | text-align: center; 249 | position: absolute; 250 | bottom: 64px; 251 | margin: 0; 252 | visibility: hidden; 253 | li { 254 | margin-bottom: 15px; 255 | } 256 | a.btn-floating { 257 | opacity: 0; 258 | } 259 | } 260 | .fab-backdrop { 261 | position: absolute; 262 | top: 0; 263 | left: 0; 264 | z-index: -1; 265 | width: $button-floating-size; 266 | height: $button-floating-size; 267 | background-color: $button-floating-background; 268 | border-radius: $button-floating-radius; 269 | transform: scale(0); 270 | } 271 | } 272 | 273 | // Flat button 274 | .btn-flat { 275 | box-shadow: none; 276 | background-color: transparent; 277 | color: $button-flat-color; 278 | cursor: pointer; 279 | transition: background-color .2s; 280 | &:focus, 281 | &:hover { 282 | box-shadow: none; 283 | } 284 | &:focus { 285 | background-color: rgba(0, 0, 0, .1); 286 | } 287 | &.disabled { 288 | background-color: transparent !important; 289 | color: $button-flat-disabled-color !important; 290 | cursor: default; 291 | } 292 | } 293 | 294 | // Large button 295 | .btn-large { 296 | @extend .btn; 297 | height: $button-large-height; 298 | line-height: $button-large-height; 299 | font-size: $button-large-font-size; 300 | padding: 0 28px; 301 | 302 | i { 303 | font-size: $button-large-icon-font-size; 304 | } 305 | } 306 | 307 | // Small button 308 | .btn-small { 309 | @extend .btn; 310 | height: $button-small-height; 311 | line-height: $button-small-height; 312 | font-size: $button-small-font-size; 313 | i { 314 | font-size: $button-small-icon-font-size; 315 | } 316 | } 317 | 318 | // Block button 319 | .btn-block { 320 | display: block; 321 | } 322 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_cards.scss: -------------------------------------------------------------------------------- 1 | 2 | 3 | .card-panel { 4 | transition: box-shadow .25s; 5 | padding: $card-padding; 6 | margin: $element-top-margin 0 $element-bottom-margin 0; 7 | border-radius: 2px; 8 | @extend .z-depth-1; 9 | background-color: $card-bg-color; 10 | } 11 | 12 | .card { 13 | position: relative; 14 | margin: $element-top-margin 0 $element-bottom-margin 0; 15 | background-color: $card-bg-color; 16 | transition: box-shadow .25s; 17 | border-radius: 2px; 18 | @extend .z-depth-1; 19 | 20 | 21 | .card-title { 22 | font-size: 24px; 23 | font-weight: 300; 24 | &.activator { 25 | cursor: pointer; 26 | } 27 | } 28 | 29 | // Card Sizes 30 | &.small, &.medium, &.large { 31 | position: relative; 32 | 33 | .card-image { 34 | max-height: 60%; 35 | overflow: hidden; 36 | } 37 | .card-image + .card-content { 38 | max-height: 40%; 39 | } 40 | .card-content { 41 | max-height: 100%; 42 | overflow: hidden; 43 | } 44 | .card-action { 45 | position: absolute; 46 | bottom: 0; 47 | left: 0; 48 | right: 0; 49 | } 50 | } 51 | 52 | &.small { 53 | height: 300px; 54 | } 55 | 56 | &.medium { 57 | height: 400px; 58 | } 59 | 60 | &.large { 61 | height: 500px; 62 | } 63 | 64 | // Horizontal Cards 65 | &.horizontal { 66 | &.small, &.medium, &.large { 67 | .card-image { 68 | height: 100%; 69 | max-height: none; 70 | overflow: visible; 71 | 72 | img { 73 | height: 100%; 74 | } 75 | } 76 | } 77 | 78 | display: flex; 79 | 80 | .card-image { 81 | max-width: 50%; 82 | img { 83 | border-radius: 2px 0 0 2px; 84 | max-width: 100%; 85 | width: auto; 86 | } 87 | } 88 | 89 | .card-stacked { 90 | display: flex; 91 | flex-direction: column; 92 | flex: 1; 93 | position: relative; 94 | 95 | .card-content { 96 | flex-grow: 1; 97 | } 98 | } 99 | } 100 | 101 | // Sticky Action Section 102 | &.sticky-action { 103 | .card-action { 104 | z-index: 2; 105 | } 106 | 107 | .card-reveal { 108 | z-index: 1; 109 | padding-bottom: 64px; 110 | } 111 | } 112 | 113 | 114 | 115 | 116 | .card-image { 117 | position: relative; 118 | 119 | // Image background for content 120 | img { 121 | display: block; 122 | border-radius: 2px 2px 0 0; 123 | position: relative; 124 | left: 0; 125 | right: 0; 126 | top: 0; 127 | bottom: 0; 128 | width: 100%; 129 | } 130 | 131 | .card-title { 132 | color: $card-bg-color; 133 | position: absolute; 134 | bottom: 0; 135 | left: 0; 136 | max-width: 100%; 137 | padding: $card-padding; 138 | } 139 | } 140 | 141 | .card-content { 142 | padding: $card-padding; 143 | border-radius: 0 0 2px 2px; 144 | 145 | p { 146 | margin: 0; 147 | } 148 | .card-title { 149 | display: block; 150 | line-height: 32px; 151 | margin-bottom: 8px; 152 | 153 | i { 154 | line-height: 32px; 155 | } 156 | } 157 | } 158 | 159 | .card-action { 160 | &:last-child { 161 | border-radius: 0 0 2px 2px; 162 | } 163 | background-color: inherit; // Use inherit to inherit color classes 164 | border-top: 1px solid rgba(160,160,160,.2); 165 | position: relative; 166 | padding: 16px $card-padding; 167 | 168 | a:not(.btn):not(.btn-large):not(.btn-floating) { 169 | color: $card-link-color; 170 | margin-right: $card-padding; 171 | transition: color .3s ease; 172 | text-transform: uppercase; 173 | 174 | &:hover { color: $card-link-color-light; } 175 | } 176 | } 177 | 178 | .card-reveal { 179 | padding: $card-padding; 180 | position: absolute; 181 | background-color: $card-bg-color; 182 | width: 100%; 183 | overflow-y: auto; 184 | left: 0; 185 | top: 100%; 186 | height: 100%; 187 | z-index: 3; 188 | display: none; 189 | 190 | .card-title { 191 | cursor: pointer; 192 | display: block; 193 | } 194 | } 195 | } 196 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_carousel.scss: -------------------------------------------------------------------------------- 1 | .carousel { 2 | &.carousel-slider { 3 | top: 0; 4 | left: 0; 5 | 6 | .carousel-fixed-item { 7 | &.with-indicators { 8 | bottom: 68px; 9 | } 10 | 11 | position: absolute; 12 | left: 0; 13 | right: 0; 14 | bottom: 20px; 15 | z-index: 1; 16 | } 17 | 18 | .carousel-item { 19 | width: 100%; 20 | height: 100%; 21 | min-height: $carousel-height; 22 | position: absolute; 23 | top: 0; 24 | left: 0; 25 | 26 | h2 { 27 | font-size: 24px; 28 | font-weight: 500; 29 | line-height: 32px; 30 | } 31 | 32 | p { 33 | font-size: 15px; 34 | } 35 | } 36 | } 37 | 38 | overflow: hidden; 39 | position: relative; 40 | width: 100%; 41 | height: $carousel-height; 42 | perspective: 500px; 43 | transform-style: preserve-3d; 44 | transform-origin: 0% 50%; 45 | 46 | .carousel-item { 47 | visibility: hidden; 48 | width: $carousel-item-width; 49 | height: $carousel-item-height; 50 | position: absolute; 51 | top: 0; 52 | left: 0; 53 | 54 | & > img { 55 | width: 100%; 56 | } 57 | } 58 | 59 | .indicators { 60 | position: absolute; 61 | text-align: center; 62 | left: 0; 63 | right: 0; 64 | bottom: 0; 65 | margin: 0; 66 | 67 | .indicator-item { 68 | &.active { 69 | background-color: #fff; 70 | } 71 | 72 | display: inline-block; 73 | position: relative; 74 | cursor: pointer; 75 | height: 8px; 76 | width: 8px; 77 | margin: 24px 4px; 78 | background-color: rgba(255,255,255,.5); 79 | 80 | transition: background-color .3s; 81 | border-radius: 50%; 82 | } 83 | } 84 | 85 | // Materialbox compatibility 86 | &.scrolling .carousel-item .materialboxed, 87 | .carousel-item:not(.active) .materialboxed { 88 | pointer-events: none; 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_chips.scss: -------------------------------------------------------------------------------- 1 | .chip { 2 | &:focus { 3 | outline: none; 4 | background-color: $chip-selected-color; 5 | color: #fff; 6 | } 7 | 8 | display: inline-block; 9 | height: 32px; 10 | font-size: 13px; 11 | font-weight: 500; 12 | color: rgba(0,0,0,.6); 13 | line-height: 32px; 14 | padding: 0 12px; 15 | border-radius: 16px; 16 | background-color: $chip-bg-color; 17 | margin-bottom: $chip-margin; 18 | margin-right: $chip-margin; 19 | 20 | > img { 21 | float: left; 22 | margin: 0 8px 0 -12px; 23 | height: 32px; 24 | width: 32px; 25 | border-radius: 50%; 26 | } 27 | 28 | .close { 29 | cursor: pointer; 30 | float: right; 31 | font-size: 16px; 32 | line-height: 32px; 33 | padding-left: 8px; 34 | } 35 | } 36 | 37 | .chips { 38 | border: none; 39 | border-bottom: 1px solid $chip-border-color; 40 | box-shadow: none; 41 | margin: $input-margin; 42 | min-height: 45px; 43 | outline: none; 44 | transition: all .3s; 45 | 46 | &.focus { 47 | border-bottom: 1px solid $chip-selected-color; 48 | box-shadow: 0 1px 0 0 $chip-selected-color; 49 | } 50 | 51 | &:hover { 52 | cursor: text; 53 | } 54 | 55 | .input { 56 | background: none; 57 | border: 0; 58 | color: rgba(0,0,0,.6); 59 | display: inline-block; 60 | font-size: $input-font-size; 61 | height: $input-height; 62 | line-height: 32px; 63 | outline: 0; 64 | margin: 0; 65 | padding: 0 !important; 66 | width: 120px !important; 67 | } 68 | 69 | .input:focus { 70 | border: 0 !important; 71 | box-shadow: none !important; 72 | } 73 | 74 | // Autocomplete 75 | .autocomplete-content { 76 | margin-top: 0; 77 | margin-bottom: 0; 78 | } 79 | } 80 | 81 | // Form prefix 82 | .prefix ~ .chips { 83 | margin-left: 3rem; 84 | width: 92%; 85 | width: calc(100% - 3rem); 86 | } 87 | .chips:empty ~ label { 88 | font-size: 0.8rem; 89 | transform: translateY(-140%); 90 | } 91 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_collapsible.scss: -------------------------------------------------------------------------------- 1 | .collapsible { 2 | border-top: 1px solid $collapsible-border-color; 3 | border-right: 1px solid $collapsible-border-color; 4 | border-left: 1px solid $collapsible-border-color; 5 | margin: $element-top-margin 0 $element-bottom-margin 0; 6 | @extend .z-depth-1; 7 | } 8 | 9 | .collapsible-header { 10 | display: flex; 11 | cursor: pointer; 12 | -webkit-tap-highlight-color: transparent; 13 | line-height: 1.5; 14 | padding: 1rem; 15 | background-color: $collapsible-header-color; 16 | border-bottom: 1px solid $collapsible-border-color; 17 | 18 | i { 19 | width: 2rem; 20 | font-size: 1.6rem; 21 | display: inline-block; 22 | text-align: center; 23 | margin-right: 1rem; 24 | } 25 | } 26 | 27 | .collapsible-body { 28 | display: none; 29 | border-bottom: 1px solid $collapsible-border-color; 30 | box-sizing: border-box; 31 | padding: 2rem; 32 | } 33 | 34 | // Sidenav collapsible styling 35 | .sidenav, 36 | .sidenav.fixed { 37 | 38 | .collapsible { 39 | border: none; 40 | box-shadow: none; 41 | 42 | li { padding: 0; } 43 | } 44 | 45 | .collapsible-header { 46 | background-color: transparent; 47 | border: none; 48 | line-height: inherit; 49 | height: inherit; 50 | padding: 0 $sidenav-padding; 51 | 52 | &:hover { background-color: rgba(0,0,0,.05); } 53 | i { line-height: inherit; } 54 | } 55 | 56 | .collapsible-body { 57 | border: 0; 58 | background-color: $collapsible-header-color; 59 | 60 | li a { 61 | padding: 0 (7.5px + $sidenav-padding) 62 | 0 (15px + $sidenav-padding); 63 | } 64 | } 65 | 66 | } 67 | 68 | // Popout Collapsible 69 | 70 | .collapsible.popout { 71 | border: none; 72 | box-shadow: none; 73 | > li { 74 | box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); 75 | // transform: scaleX(.92); 76 | margin: 0 24px; 77 | transition: margin .35s cubic-bezier(0.250, 0.460, 0.450, 0.940); 78 | } 79 | > li.active { 80 | box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15); 81 | margin: 16px 0; 82 | // transform: scaleX(1); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_color-classes.scss: -------------------------------------------------------------------------------- 1 | // Color Classes 2 | 3 | @each $color_name, $color in $colors { 4 | @each $color_type, $color_value in $color { 5 | @if $color_type == "base" { 6 | .#{$color_name} { 7 | background-color: $color_value !important; 8 | } 9 | .#{$color_name}-text { 10 | color: $color_value !important; 11 | } 12 | } 13 | @else if $color_name != "shades" { 14 | .#{$color_name}.#{$color_type} { 15 | background-color: $color_value !important; 16 | } 17 | .#{$color_name}-text.text-#{$color_type} { 18 | color: $color_value !important; 19 | } 20 | } 21 | } 22 | } 23 | 24 | // Shade classes 25 | @each $color, $color_value in $shades { 26 | .#{$color} { 27 | background-color: $color_value !important; 28 | } 29 | .#{$color}-text { 30 | color: $color_value !important; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_color-variables.scss: -------------------------------------------------------------------------------- 1 | // Google Color Palette defined: http://www.google.com/design/spec/style/color.html 2 | 3 | $materialize-red: ( 4 | "base": #e51c23, 5 | "lighten-5": #fdeaeb, 6 | "lighten-4": #f8c1c3, 7 | "lighten-3": #f3989b, 8 | "lighten-2": #ee6e73, 9 | "lighten-1": #ea454b, 10 | "darken-1": #d0181e, 11 | "darken-2": #b9151b, 12 | "darken-3": #a21318, 13 | "darken-4": #8b1014, 14 | ); 15 | 16 | $red: ( 17 | "base": #F44336, 18 | "lighten-5": #FFEBEE, 19 | "lighten-4": #FFCDD2, 20 | "lighten-3": #EF9A9A, 21 | "lighten-2": #E57373, 22 | "lighten-1": #EF5350, 23 | "darken-1": #E53935, 24 | "darken-2": #D32F2F, 25 | "darken-3": #C62828, 26 | "darken-4": #B71C1C, 27 | "accent-1": #FF8A80, 28 | "accent-2": #FF5252, 29 | "accent-3": #FF1744, 30 | "accent-4": #D50000 31 | ); 32 | 33 | $pink: ( 34 | "base": #e91e63, 35 | "lighten-5": #fce4ec, 36 | "lighten-4": #f8bbd0, 37 | "lighten-3": #f48fb1, 38 | "lighten-2": #f06292, 39 | "lighten-1": #ec407a, 40 | "darken-1": #d81b60, 41 | "darken-2": #c2185b, 42 | "darken-3": #ad1457, 43 | "darken-4": #880e4f, 44 | "accent-1": #ff80ab, 45 | "accent-2": #ff4081, 46 | "accent-3": #f50057, 47 | "accent-4": #c51162 48 | ); 49 | 50 | $purple: ( 51 | "base": #9c27b0, 52 | "lighten-5": #f3e5f5, 53 | "lighten-4": #e1bee7, 54 | "lighten-3": #ce93d8, 55 | "lighten-2": #ba68c8, 56 | "lighten-1": #ab47bc, 57 | "darken-1": #8e24aa, 58 | "darken-2": #7b1fa2, 59 | "darken-3": #6a1b9a, 60 | "darken-4": #4a148c, 61 | "accent-1": #ea80fc, 62 | "accent-2": #e040fb, 63 | "accent-3": #d500f9, 64 | "accent-4": #aa00ff 65 | ); 66 | 67 | $deep-purple: ( 68 | "base": #673ab7, 69 | "lighten-5": #ede7f6, 70 | "lighten-4": #d1c4e9, 71 | "lighten-3": #b39ddb, 72 | "lighten-2": #9575cd, 73 | "lighten-1": #7e57c2, 74 | "darken-1": #5e35b1, 75 | "darken-2": #512da8, 76 | "darken-3": #4527a0, 77 | "darken-4": #311b92, 78 | "accent-1": #b388ff, 79 | "accent-2": #7c4dff, 80 | "accent-3": #651fff, 81 | "accent-4": #6200ea 82 | ); 83 | 84 | $indigo: ( 85 | "base": #3f51b5, 86 | "lighten-5": #e8eaf6, 87 | "lighten-4": #c5cae9, 88 | "lighten-3": #9fa8da, 89 | "lighten-2": #7986cb, 90 | "lighten-1": #5c6bc0, 91 | "darken-1": #3949ab, 92 | "darken-2": #303f9f, 93 | "darken-3": #283593, 94 | "darken-4": #1a237e, 95 | "accent-1": #8c9eff, 96 | "accent-2": #536dfe, 97 | "accent-3": #3d5afe, 98 | "accent-4": #304ffe 99 | ); 100 | 101 | $blue: ( 102 | "base": #2196F3, 103 | "lighten-5": #E3F2FD, 104 | "lighten-4": #BBDEFB, 105 | "lighten-3": #90CAF9, 106 | "lighten-2": #64B5F6, 107 | "lighten-1": #42A5F5, 108 | "darken-1": #1E88E5, 109 | "darken-2": #1976D2, 110 | "darken-3": #1565C0, 111 | "darken-4": #0D47A1, 112 | "accent-1": #82B1FF, 113 | "accent-2": #448AFF, 114 | "accent-3": #2979FF, 115 | "accent-4": #2962FF 116 | ); 117 | 118 | $light-blue: ( 119 | "base": #03a9f4, 120 | "lighten-5": #e1f5fe, 121 | "lighten-4": #b3e5fc, 122 | "lighten-3": #81d4fa, 123 | "lighten-2": #4fc3f7, 124 | "lighten-1": #29b6f6, 125 | "darken-1": #039be5, 126 | "darken-2": #0288d1, 127 | "darken-3": #0277bd, 128 | "darken-4": #01579b, 129 | "accent-1": #80d8ff, 130 | "accent-2": #40c4ff, 131 | "accent-3": #00b0ff, 132 | "accent-4": #0091ea 133 | ); 134 | 135 | $cyan: ( 136 | "base": #00bcd4, 137 | "lighten-5": #e0f7fa, 138 | "lighten-4": #b2ebf2, 139 | "lighten-3": #80deea, 140 | "lighten-2": #4dd0e1, 141 | "lighten-1": #26c6da, 142 | "darken-1": #00acc1, 143 | "darken-2": #0097a7, 144 | "darken-3": #00838f, 145 | "darken-4": #006064, 146 | "accent-1": #84ffff, 147 | "accent-2": #18ffff, 148 | "accent-3": #00e5ff, 149 | "accent-4": #00b8d4 150 | ); 151 | 152 | $teal: ( 153 | "base": #009688, 154 | "lighten-5": #e0f2f1, 155 | "lighten-4": #b2dfdb, 156 | "lighten-3": #80cbc4, 157 | "lighten-2": #4db6ac, 158 | "lighten-1": #26a69a, 159 | "darken-1": #00897b, 160 | "darken-2": #00796b, 161 | "darken-3": #00695c, 162 | "darken-4": #004d40, 163 | "accent-1": #a7ffeb, 164 | "accent-2": #64ffda, 165 | "accent-3": #1de9b6, 166 | "accent-4": #00bfa5 167 | ); 168 | 169 | $green: ( 170 | "base": #4CAF50, 171 | "lighten-5": #E8F5E9, 172 | "lighten-4": #C8E6C9, 173 | "lighten-3": #A5D6A7, 174 | "lighten-2": #81C784, 175 | "lighten-1": #66BB6A, 176 | "darken-1": #43A047, 177 | "darken-2": #388E3C, 178 | "darken-3": #2E7D32, 179 | "darken-4": #1B5E20, 180 | "accent-1": #B9F6CA, 181 | "accent-2": #69F0AE, 182 | "accent-3": #00E676, 183 | "accent-4": #00C853 184 | ); 185 | 186 | $light-green: ( 187 | "base": #8bc34a, 188 | "lighten-5": #f1f8e9, 189 | "lighten-4": #dcedc8, 190 | "lighten-3": #c5e1a5, 191 | "lighten-2": #aed581, 192 | "lighten-1": #9ccc65, 193 | "darken-1": #7cb342, 194 | "darken-2": #689f38, 195 | "darken-3": #558b2f, 196 | "darken-4": #33691e, 197 | "accent-1": #ccff90, 198 | "accent-2": #b2ff59, 199 | "accent-3": #76ff03, 200 | "accent-4": #64dd17 201 | ); 202 | 203 | $lime: ( 204 | "base": #cddc39, 205 | "lighten-5": #f9fbe7, 206 | "lighten-4": #f0f4c3, 207 | "lighten-3": #e6ee9c, 208 | "lighten-2": #dce775, 209 | "lighten-1": #d4e157, 210 | "darken-1": #c0ca33, 211 | "darken-2": #afb42b, 212 | "darken-3": #9e9d24, 213 | "darken-4": #827717, 214 | "accent-1": #f4ff81, 215 | "accent-2": #eeff41, 216 | "accent-3": #c6ff00, 217 | "accent-4": #aeea00 218 | ); 219 | 220 | $yellow: ( 221 | "base": #ffeb3b, 222 | "lighten-5": #fffde7, 223 | "lighten-4": #fff9c4, 224 | "lighten-3": #fff59d, 225 | "lighten-2": #fff176, 226 | "lighten-1": #ffee58, 227 | "darken-1": #fdd835, 228 | "darken-2": #fbc02d, 229 | "darken-3": #f9a825, 230 | "darken-4": #f57f17, 231 | "accent-1": #ffff8d, 232 | "accent-2": #ffff00, 233 | "accent-3": #ffea00, 234 | "accent-4": #ffd600 235 | ); 236 | 237 | $amber: ( 238 | "base": #ffc107, 239 | "lighten-5": #fff8e1, 240 | "lighten-4": #ffecb3, 241 | "lighten-3": #ffe082, 242 | "lighten-2": #ffd54f, 243 | "lighten-1": #ffca28, 244 | "darken-1": #ffb300, 245 | "darken-2": #ffa000, 246 | "darken-3": #ff8f00, 247 | "darken-4": #ff6f00, 248 | "accent-1": #ffe57f, 249 | "accent-2": #ffd740, 250 | "accent-3": #ffc400, 251 | "accent-4": #ffab00 252 | ); 253 | 254 | $orange: ( 255 | "base": #ff9800, 256 | "lighten-5": #fff3e0, 257 | "lighten-4": #ffe0b2, 258 | "lighten-3": #ffcc80, 259 | "lighten-2": #ffb74d, 260 | "lighten-1": #ffa726, 261 | "darken-1": #fb8c00, 262 | "darken-2": #f57c00, 263 | "darken-3": #ef6c00, 264 | "darken-4": #e65100, 265 | "accent-1": #ffd180, 266 | "accent-2": #ffab40, 267 | "accent-3": #ff9100, 268 | "accent-4": #ff6d00 269 | ); 270 | 271 | $deep-orange: ( 272 | "base": #ff5722, 273 | "lighten-5": #fbe9e7, 274 | "lighten-4": #ffccbc, 275 | "lighten-3": #ffab91, 276 | "lighten-2": #ff8a65, 277 | "lighten-1": #ff7043, 278 | "darken-1": #f4511e, 279 | "darken-2": #e64a19, 280 | "darken-3": #d84315, 281 | "darken-4": #bf360c, 282 | "accent-1": #ff9e80, 283 | "accent-2": #ff6e40, 284 | "accent-3": #ff3d00, 285 | "accent-4": #dd2c00 286 | ); 287 | 288 | $brown: ( 289 | "base": #795548, 290 | "lighten-5": #efebe9, 291 | "lighten-4": #d7ccc8, 292 | "lighten-3": #bcaaa4, 293 | "lighten-2": #a1887f, 294 | "lighten-1": #8d6e63, 295 | "darken-1": #6d4c41, 296 | "darken-2": #5d4037, 297 | "darken-3": #4e342e, 298 | "darken-4": #3e2723 299 | ); 300 | 301 | $blue-grey: ( 302 | "base": #607d8b, 303 | "lighten-5": #eceff1, 304 | "lighten-4": #cfd8dc, 305 | "lighten-3": #b0bec5, 306 | "lighten-2": #90a4ae, 307 | "lighten-1": #78909c, 308 | "darken-1": #546e7a, 309 | "darken-2": #455a64, 310 | "darken-3": #37474f, 311 | "darken-4": #263238 312 | ); 313 | 314 | $grey: ( 315 | "base": #9e9e9e, 316 | "lighten-5": #fafafa, 317 | "lighten-4": #f5f5f5, 318 | "lighten-3": #eeeeee, 319 | "lighten-2": #e0e0e0, 320 | "lighten-1": #bdbdbd, 321 | "darken-1": #757575, 322 | "darken-2": #616161, 323 | "darken-3": #424242, 324 | "darken-4": #212121 325 | ); 326 | 327 | $shades: ( 328 | "black": #000000, 329 | "white": #FFFFFF, 330 | "transparent": transparent 331 | ); 332 | 333 | $colors: ( 334 | "materialize-red": $materialize-red, 335 | "red": $red, 336 | "pink": $pink, 337 | "purple": $purple, 338 | "deep-purple": $deep-purple, 339 | "indigo": $indigo, 340 | "blue": $blue, 341 | "light-blue": $light-blue, 342 | "cyan": $cyan, 343 | "teal": $teal, 344 | "green": $green, 345 | "light-green": $light-green, 346 | "lime": $lime, 347 | "yellow": $yellow, 348 | "amber": $amber, 349 | "orange": $orange, 350 | "deep-orange": $deep-orange, 351 | "brown": $brown, 352 | "blue-grey": $blue-grey, 353 | "grey": $grey, 354 | "shades": $shades 355 | ) !default; 356 | 357 | 358 | // usage: color("name_of_color", "type_of_color") 359 | // to avoid to repeating map-get($colors, ...) 360 | 361 | @function color($color, $type) { 362 | @if map-has-key($colors, $color) { 363 | $curr_color: map-get($colors, $color); 364 | @if map-has-key($curr_color, $type) { 365 | @return map-get($curr_color, $type); 366 | } 367 | } 368 | @warn "Unknown `#{$color}` - `#{$type}` in $colors."; 369 | @return null; 370 | } 371 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_datepicker.scss: -------------------------------------------------------------------------------- 1 | /* Modal */ 2 | .datepicker-modal { 3 | max-width: 325px; 4 | min-width: 300px; 5 | max-height: none; 6 | } 7 | 8 | .datepicker-container.modal-content { 9 | display: flex; 10 | flex-direction: column; 11 | padding: 0; 12 | } 13 | 14 | .datepicker-controls { 15 | display: flex; 16 | justify-content: space-between; 17 | width: 280px; 18 | margin: 0 auto; 19 | 20 | .selects-container { 21 | display: flex; 22 | } 23 | 24 | .select-wrapper { 25 | input { 26 | &:focus { 27 | border-bottom: none; 28 | } 29 | border-bottom: none; 30 | text-align: center; 31 | margin: 0; 32 | } 33 | 34 | .caret { 35 | display: none; 36 | } 37 | } 38 | 39 | .select-year input { 40 | width: 50px; 41 | } 42 | 43 | .select-month input { 44 | width: 70px; 45 | } 46 | } 47 | 48 | .month-prev, .month-next { 49 | margin-top: 4px; 50 | cursor: pointer; 51 | background-color: transparent; 52 | border: none; 53 | } 54 | 55 | 56 | /* Date Display */ 57 | .datepicker-date-display { 58 | flex: 1 auto; 59 | background-color: $secondary-color; 60 | color: #fff; 61 | padding: 20px 22px; 62 | font-weight: 500; 63 | 64 | .year-text { 65 | display: block; 66 | font-size: 1.5rem; 67 | line-height: 25px; 68 | color: $datepicker-year; 69 | } 70 | 71 | .date-text { 72 | display: block; 73 | font-size: 2.8rem; 74 | line-height: 47px; 75 | font-weight: 500; 76 | } 77 | } 78 | 79 | 80 | /* Calendar */ 81 | .datepicker-calendar-container { 82 | flex: 2.5 auto; 83 | } 84 | 85 | .datepicker-table { 86 | width: 280px; 87 | font-size: 1rem; 88 | margin: 0 auto; 89 | 90 | thead { 91 | border-bottom: none; 92 | } 93 | 94 | th { 95 | padding: 10px 5px; 96 | text-align: center; 97 | } 98 | 99 | tr { 100 | border: none; 101 | } 102 | 103 | abbr { 104 | text-decoration: none; 105 | color: $datepicker-calendar-header-color; 106 | } 107 | 108 | td { 109 | &.is-today { 110 | color: $secondary-color; 111 | } 112 | 113 | &.is-selected { 114 | background-color: $secondary-color; 115 | color: #fff; 116 | } 117 | 118 | &.is-outside-current-month, 119 | &.is-disabled { 120 | color: $datepicker-disabled-day-color; 121 | pointer-events: none; 122 | } 123 | 124 | border-radius: 50%; 125 | padding: 0; 126 | } 127 | } 128 | 129 | .datepicker-day-button { 130 | &:focus { 131 | background-color: $datepicker-day-focus; 132 | } 133 | 134 | background-color: transparent; 135 | border: none; 136 | line-height: 38px; 137 | display: block; 138 | width: 100%; 139 | border-radius: 50%; 140 | padding: 0 5px; 141 | cursor: pointer; 142 | color: inherit; 143 | } 144 | 145 | 146 | /* Footer */ 147 | .datepicker-footer { 148 | width: 280px; 149 | margin: 0 auto; 150 | padding-bottom: 5px; 151 | display: flex; 152 | justify-content: space-between; 153 | } 154 | 155 | .datepicker-cancel, 156 | .datepicker-clear, 157 | .datepicker-today, 158 | .datepicker-done { 159 | color: $secondary-color; 160 | padding: 0 1rem; 161 | } 162 | 163 | .datepicker-clear { 164 | color: $error-color; 165 | } 166 | 167 | 168 | /* Media Queries */ 169 | @media #{$medium-and-up} { 170 | .datepicker-modal { 171 | max-width: 625px; 172 | } 173 | 174 | .datepicker-container.modal-content { 175 | flex-direction: row; 176 | } 177 | 178 | .datepicker-controls, 179 | .datepicker-table, 180 | .datepicker-footer { 181 | width: 320px; 182 | } 183 | 184 | .datepicker-day-button { 185 | line-height: 44px; 186 | } 187 | } 188 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_dropdown.scss: -------------------------------------------------------------------------------- 1 | .dropdown-content { 2 | &:focus { 3 | outline: 0; 4 | } 5 | 6 | 7 | @extend .z-depth-1; 8 | background-color: $dropdown-bg-color; 9 | margin: 0; 10 | display: none; 11 | min-width: 100px; 12 | overflow-y: auto; 13 | opacity: 0; 14 | position: absolute; 15 | left: 0; 16 | top: 0; 17 | z-index: 9999; // TODO: Check if this doesn't break other things 18 | transform-origin: 0 0; 19 | 20 | 21 | li { 22 | &:hover, &.active { 23 | background-color: $dropdown-hover-bg-color; 24 | } 25 | 26 | &:focus { 27 | outline: none; 28 | background-color: darken($dropdown-hover-bg-color, 8%); 29 | } 30 | 31 | &.divider { 32 | min-height: 0; 33 | height: 1px; 34 | } 35 | 36 | & > a, & > span { 37 | font-size: 16px; 38 | color: $dropdown-color; 39 | display: block; 40 | line-height: 22px; 41 | padding: (($dropdown-item-height - 22) / 2) 16px; 42 | } 43 | 44 | & > span > label { 45 | top: 1px; 46 | left: 0; 47 | height: 18px; 48 | } 49 | 50 | // Icon alignment override 51 | & > a > i { 52 | height: inherit; 53 | line-height: inherit; 54 | float: left; 55 | margin: 0 24px 0 0; 56 | width: 24px; 57 | } 58 | 59 | 60 | clear: both; 61 | color: $off-black; 62 | cursor: pointer; 63 | min-height: $dropdown-item-height; 64 | line-height: 1.5rem; 65 | width: 100%; 66 | text-align: left; 67 | } 68 | } 69 | 70 | // Input field specificity bugfix 71 | .input-field.col .dropdown-content [type="checkbox"] + label { 72 | top: 1px; 73 | left: 0; 74 | height: 18px; 75 | transform: none; 76 | } 77 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_grid.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | margin: 0 auto; 3 | max-width: 1280px; 4 | width: 90%; 5 | } 6 | @media #{$medium-and-up} { 7 | .container { 8 | width: 85%; 9 | } 10 | } 11 | @media #{$large-and-up} { 12 | .container { 13 | width: 70%; 14 | } 15 | } 16 | .col .row { 17 | margin-left: (-1 * $gutter-width / 2); 18 | margin-right: (-1 * $gutter-width / 2); 19 | } 20 | 21 | .section { 22 | padding-top: 1rem; 23 | padding-bottom: 1rem; 24 | 25 | &.no-pad { 26 | padding: 0; 27 | } 28 | &.no-pad-bot { 29 | padding-bottom: 0; 30 | } 31 | &.no-pad-top { 32 | padding-top: 0; 33 | } 34 | } 35 | 36 | 37 | // Mixins to eliminate code repitition 38 | @mixin reset-offset { 39 | margin-left: auto; 40 | left: auto; 41 | right: auto; 42 | } 43 | @mixin grid-classes($size, $i, $perc) { 44 | &.offset-#{$size}#{$i} { 45 | margin-left: $perc; 46 | } 47 | &.pull-#{$size}#{$i} { 48 | right: $perc; 49 | } 50 | &.push-#{$size}#{$i} { 51 | left: $perc; 52 | } 53 | } 54 | 55 | 56 | .row { 57 | margin-left: auto; 58 | margin-right: auto; 59 | margin-bottom: 20px; 60 | 61 | // Clear floating children 62 | &:after { 63 | content: ""; 64 | display: table; 65 | clear: both; 66 | } 67 | 68 | .col { 69 | float: left; 70 | box-sizing: border-box; 71 | padding: 0 $gutter-width / 2; 72 | min-height: 1px; 73 | 74 | &[class*="push-"], 75 | &[class*="pull-"] { 76 | position: relative; 77 | } 78 | 79 | $i: 1; 80 | @while $i <= $num-cols { 81 | $perc: unquote((100 / ($num-cols / $i)) + "%"); 82 | &.s#{$i} { 83 | width: $perc; 84 | @include reset-offset; 85 | } 86 | $i: $i + 1; 87 | } 88 | 89 | $i: 1; 90 | @while $i <= $num-cols { 91 | $perc: unquote((100 / ($num-cols / $i)) + "%"); 92 | @include grid-classes("s", $i, $perc); 93 | $i: $i + 1; 94 | } 95 | 96 | @media #{$medium-and-up} { 97 | 98 | $i: 1; 99 | @while $i <= $num-cols { 100 | $perc: unquote((100 / ($num-cols / $i)) + "%"); 101 | &.m#{$i} { 102 | width: $perc; 103 | @include reset-offset; 104 | } 105 | $i: $i + 1 106 | } 107 | 108 | $i: 1; 109 | @while $i <= $num-cols { 110 | $perc: unquote((100 / ($num-cols / $i)) + "%"); 111 | @include grid-classes("m", $i, $perc); 112 | $i: $i + 1; 113 | } 114 | } 115 | 116 | @media #{$large-and-up} { 117 | 118 | $i: 1; 119 | @while $i <= $num-cols { 120 | $perc: unquote((100 / ($num-cols / $i)) + "%"); 121 | &.l#{$i} { 122 | width: $perc; 123 | @include reset-offset; 124 | } 125 | $i: $i + 1; 126 | } 127 | 128 | $i: 1; 129 | @while $i <= $num-cols { 130 | $perc: unquote((100 / ($num-cols / $i)) + "%"); 131 | @include grid-classes("l", $i, $perc); 132 | $i: $i + 1; 133 | } 134 | } 135 | 136 | @media #{$extra-large-and-up} { 137 | 138 | $i: 1; 139 | @while $i <= $num-cols { 140 | $perc: unquote((100 / ($num-cols / $i)) + "%"); 141 | &.xl#{$i} { 142 | width: $perc; 143 | @include reset-offset; 144 | } 145 | $i: $i + 1; 146 | } 147 | 148 | $i: 1; 149 | @while $i <= $num-cols { 150 | $perc: unquote((100 / ($num-cols / $i)) + "%"); 151 | @include grid-classes("xl", $i, $perc); 152 | $i: $i + 1; 153 | } 154 | } 155 | } 156 | } 157 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_icons-material-design.scss: -------------------------------------------------------------------------------- 1 | /* This is needed for some mobile phones to display the Google Icon font properly */ 2 | .material-icons { 3 | text-rendering: optimizeLegibility; 4 | font-feature-settings: 'liga'; 5 | } 6 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_materialbox.scss: -------------------------------------------------------------------------------- 1 | .materialboxed { 2 | &:hover { 3 | &:not(.active) { 4 | opacity: .8; 5 | } 6 | } 7 | 8 | display: block; 9 | cursor: zoom-in; 10 | position: relative; 11 | transition: opacity .4s; 12 | -webkit-backface-visibility: hidden; 13 | 14 | &.active { 15 | cursor: zoom-out; 16 | } 17 | } 18 | 19 | #materialbox-overlay { 20 | position:fixed; 21 | top: 0; 22 | right: 0; 23 | bottom: 0; 24 | left: 0; 25 | background-color: #292929; 26 | z-index: 1000; 27 | will-change: opacity; 28 | } 29 | 30 | .materialbox-caption { 31 | position: fixed; 32 | display: none; 33 | color: #fff; 34 | line-height: 50px; 35 | bottom: 0; 36 | left: 0; 37 | width: 100%; 38 | text-align: center; 39 | padding: 0% 15%; 40 | height: 50px; 41 | z-index: 1000; 42 | -webkit-font-smoothing: antialiased; 43 | } -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_modal.scss: -------------------------------------------------------------------------------- 1 | .modal { 2 | @extend .z-depth-5; 3 | 4 | display: none; 5 | position: fixed; 6 | left: 0; 7 | right: 0; 8 | background-color: #fafafa; 9 | padding: 0; 10 | max-height: 70%; 11 | width: 55%; 12 | margin: auto; 13 | overflow-y: auto; 14 | 15 | border-radius: 2px; 16 | will-change: top, opacity; 17 | 18 | @media #{$medium-and-down} { 19 | width: 80%; 20 | } 21 | 22 | h1,h2,h3,h4 { 23 | margin-top: 0; 24 | } 25 | 26 | .modal-content { 27 | padding: 24px; 28 | } 29 | .modal-close { 30 | cursor: pointer; 31 | } 32 | 33 | .modal-footer { 34 | border-radius: 0 0 2px 2px; 35 | background-color: #fafafa; 36 | padding: 4px 6px; 37 | height: 56px; 38 | width: 100%; 39 | text-align: right; 40 | 41 | .btn, .btn-flat { 42 | margin: 6px 0; 43 | } 44 | } 45 | } 46 | .modal-overlay { 47 | position: fixed; 48 | z-index: 999; 49 | top: -25%; 50 | left: 0; 51 | bottom: 0; 52 | right: 0; 53 | height: 125%; 54 | width: 100%; 55 | background: #000; 56 | display: none; 57 | 58 | will-change: opacity; 59 | } 60 | 61 | // Modal with fixed action footer 62 | .modal.modal-fixed-footer { 63 | padding: 0; 64 | height: 70%; 65 | 66 | .modal-content { 67 | position: absolute; 68 | height: calc(100% - 56px); 69 | max-height: 100%; 70 | width: 100%; 71 | overflow-y: auto; 72 | } 73 | 74 | .modal-footer { 75 | border-top: 1px solid rgba(0,0,0,.1); 76 | position: absolute; 77 | bottom: 0; 78 | } 79 | } 80 | 81 | // Modal Bottom Sheet Style 82 | .modal.bottom-sheet { 83 | top: auto; 84 | bottom: -100%; 85 | margin: 0; 86 | width: 100%; 87 | max-height: 45%; 88 | border-radius: 0; 89 | will-change: bottom, opacity; 90 | } 91 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_navbar.scss: -------------------------------------------------------------------------------- 1 | nav { 2 | &.nav-extended { 3 | height: auto; 4 | 5 | .nav-wrapper { 6 | min-height: $navbar-height-mobile; 7 | height: auto; 8 | } 9 | 10 | .nav-content { 11 | position: relative; 12 | line-height: normal; 13 | } 14 | } 15 | 16 | color: $navbar-font-color; 17 | @extend .z-depth-1; 18 | background-color: $primary-color; 19 | width: 100%; 20 | height: $navbar-height-mobile; 21 | line-height: $navbar-line-height-mobile; 22 | 23 | a { color: $navbar-font-color; } 24 | 25 | i, 26 | [class^="mdi-"], [class*="mdi-"], 27 | i.material-icons { 28 | display: block; 29 | font-size: 24px; 30 | height: $navbar-height-mobile; 31 | line-height: $navbar-line-height-mobile; 32 | } 33 | 34 | .nav-wrapper { 35 | position: relative; 36 | height: 100%; 37 | } 38 | 39 | @media #{$large-and-up} { 40 | a.sidenav-trigger { display: none; } 41 | } 42 | 43 | 44 | // Collapse button 45 | .sidenav-trigger { 46 | float: left; 47 | position: relative; 48 | z-index: 1; 49 | height: $navbar-height-mobile; 50 | margin: 0 18px; 51 | 52 | i { 53 | height: $navbar-height-mobile; 54 | line-height: $navbar-line-height-mobile; 55 | } 56 | } 57 | 58 | 59 | // Logo 60 | .brand-logo { 61 | position: absolute; 62 | color: $navbar-font-color; 63 | display: inline-block; 64 | font-size: $navbar-brand-font-size; 65 | padding: 0; 66 | 67 | &.center { 68 | left: 50%; 69 | transform: translateX(-50%); 70 | } 71 | 72 | @media #{$medium-and-down} { 73 | left: 50%; 74 | transform: translateX(-50%); 75 | 76 | &.left, &.right { 77 | padding: 0; 78 | transform: none; 79 | } 80 | 81 | &.left { left: 0.5rem; } 82 | &.right { 83 | right: 0.5rem; 84 | left: auto; 85 | } 86 | } 87 | 88 | &.right { 89 | right: 0.5rem; 90 | padding: 0; 91 | } 92 | 93 | i, 94 | [class^="mdi-"], [class*="mdi-"], 95 | i.material-icons { 96 | float: left; 97 | margin-right: 15px; 98 | } 99 | } 100 | 101 | 102 | // Title 103 | .nav-title { 104 | display: inline-block; 105 | font-size: 32px; 106 | padding: 28px 0; 107 | } 108 | 109 | 110 | // Navbar Links 111 | ul { 112 | margin: 0; 113 | 114 | li { 115 | transition: background-color .3s; 116 | float: left; 117 | padding: 0; 118 | 119 | &.active { 120 | background-color: rgba(0,0,0,.1); 121 | } 122 | } 123 | a { 124 | transition: background-color .3s; 125 | font-size: $navbar-font-size; 126 | color: $navbar-font-color; 127 | display: block; 128 | padding: 0 15px; 129 | cursor: pointer; 130 | 131 | &.btn, &.btn-large, &.btn-flat, &.btn-floating { 132 | margin-top: -2px; 133 | margin-left: 15px; 134 | margin-right: 15px; 135 | 136 | & > .material-icons { 137 | height: inherit; 138 | line-height: inherit; 139 | } 140 | } 141 | 142 | &:hover { 143 | background-color: rgba(0,0,0,.1); 144 | } 145 | } 146 | 147 | &.left { 148 | float: left; 149 | } 150 | } 151 | 152 | // Navbar Search Form 153 | form { 154 | height: 100%; 155 | } 156 | 157 | .input-field { 158 | margin: 0; 159 | height: 100%; 160 | 161 | input { 162 | height: 100%; 163 | font-size: 1.2rem; 164 | border: none; 165 | padding-left: 2rem; 166 | 167 | &:focus, &[type=text]:valid, &[type=password]:valid, 168 | &[type=email]:valid, &[type=url]:valid, &[type=date]:valid { 169 | border: none; 170 | box-shadow: none; 171 | } 172 | } 173 | 174 | label { 175 | top: 0; 176 | left: 0; 177 | 178 | i { 179 | color: rgba(255,255,255,.7); 180 | transition: color .3s; 181 | } 182 | &.active i { color: $navbar-font-color; } 183 | } 184 | } 185 | } 186 | 187 | // Fixed Navbar 188 | .navbar-fixed { 189 | position: relative; 190 | height: $navbar-height-mobile; 191 | z-index: 997; 192 | 193 | nav { 194 | position: fixed; 195 | } 196 | } 197 | @media #{$medium-and-up} { 198 | nav.nav-extended .nav-wrapper { 199 | min-height: $navbar-height; 200 | } 201 | nav, nav .nav-wrapper i, nav a.sidenav-trigger, nav a.sidenav-trigger i { 202 | height: $navbar-height; 203 | line-height: $navbar-line-height; 204 | } 205 | .navbar-fixed { 206 | height: $navbar-height; 207 | } 208 | } 209 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_normalize.scss: -------------------------------------------------------------------------------- 1 | /*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */ 2 | 3 | /* Document 4 | ========================================================================== */ 5 | 6 | /** 7 | * 1. Correct the line height in all browsers. 8 | * 2. Prevent adjustments of font size after orientation changes in 9 | * IE on Windows Phone and in iOS. 10 | */ 11 | 12 | html { 13 | line-height: 1.15; /* 1 */ 14 | -ms-text-size-adjust: 100%; /* 2 */ 15 | -webkit-text-size-adjust: 100%; /* 2 */ 16 | } 17 | 18 | /* Sections 19 | ========================================================================== */ 20 | 21 | /** 22 | * Remove the margin in all browsers (opinionated). 23 | */ 24 | 25 | body { 26 | margin: 0; 27 | } 28 | 29 | /** 30 | * Add the correct display in IE 9-. 31 | */ 32 | 33 | article, 34 | aside, 35 | footer, 36 | header, 37 | nav, 38 | section { 39 | display: block; 40 | } 41 | 42 | /** 43 | * Correct the font size and margin on `h1` elements within `section` and 44 | * `article` contexts in Chrome, Firefox, and Safari. 45 | */ 46 | 47 | h1 { 48 | font-size: 2em; 49 | margin: 0.67em 0; 50 | } 51 | 52 | /* Grouping content 53 | ========================================================================== */ 54 | 55 | /** 56 | * Add the correct display in IE 9-. 57 | * 1. Add the correct display in IE. 58 | */ 59 | 60 | figcaption, 61 | figure, 62 | main { /* 1 */ 63 | display: block; 64 | } 65 | 66 | /** 67 | * Add the correct margin in IE 8. 68 | */ 69 | 70 | figure { 71 | margin: 1em 40px; 72 | } 73 | 74 | /** 75 | * 1. Add the correct box sizing in Firefox. 76 | * 2. Show the overflow in Edge and IE. 77 | */ 78 | 79 | hr { 80 | box-sizing: content-box; /* 1 */ 81 | height: 0; /* 1 */ 82 | overflow: visible; /* 2 */ 83 | } 84 | 85 | /** 86 | * 1. Correct the inheritance and scaling of font size in all browsers. 87 | * 2. Correct the odd `em` font sizing in all browsers. 88 | */ 89 | 90 | pre { 91 | font-family: monospace, monospace; /* 1 */ 92 | font-size: 1em; /* 2 */ 93 | } 94 | 95 | /* Text-level semantics 96 | ========================================================================== */ 97 | 98 | /** 99 | * 1. Remove the gray background on active links in IE 10. 100 | * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. 101 | */ 102 | 103 | a { 104 | background-color: transparent; /* 1 */ 105 | -webkit-text-decoration-skip: objects; /* 2 */ 106 | } 107 | 108 | /** 109 | * 1. Remove the bottom border in Chrome 57- and Firefox 39-. 110 | * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. 111 | */ 112 | 113 | abbr[title] { 114 | border-bottom: none; /* 1 */ 115 | text-decoration: underline; /* 2 */ 116 | text-decoration: underline dotted; /* 2 */ 117 | } 118 | 119 | /** 120 | * Prevent the duplicate application of `bolder` by the next rule in Safari 6. 121 | */ 122 | 123 | b, 124 | strong { 125 | font-weight: inherit; 126 | } 127 | 128 | /** 129 | * Add the correct font weight in Chrome, Edge, and Safari. 130 | */ 131 | 132 | b, 133 | strong { 134 | font-weight: bolder; 135 | } 136 | 137 | /** 138 | * 1. Correct the inheritance and scaling of font size in all browsers. 139 | * 2. Correct the odd `em` font sizing in all browsers. 140 | */ 141 | 142 | code, 143 | kbd, 144 | samp { 145 | font-family: monospace, monospace; /* 1 */ 146 | font-size: 1em; /* 2 */ 147 | } 148 | 149 | /** 150 | * Add the correct font style in Android 4.3-. 151 | */ 152 | 153 | dfn { 154 | font-style: italic; 155 | } 156 | 157 | /** 158 | * Add the correct background and color in IE 9-. 159 | */ 160 | 161 | mark { 162 | background-color: #ff0; 163 | color: #000; 164 | } 165 | 166 | /** 167 | * Add the correct font size in all browsers. 168 | */ 169 | 170 | small { 171 | font-size: 80%; 172 | } 173 | 174 | /** 175 | * Prevent `sub` and `sup` elements from affecting the line height in 176 | * all browsers. 177 | */ 178 | 179 | sub, 180 | sup { 181 | font-size: 75%; 182 | line-height: 0; 183 | position: relative; 184 | vertical-align: baseline; 185 | } 186 | 187 | sub { 188 | bottom: -0.25em; 189 | } 190 | 191 | sup { 192 | top: -0.5em; 193 | } 194 | 195 | /* Embedded content 196 | ========================================================================== */ 197 | 198 | /** 199 | * Add the correct display in IE 9-. 200 | */ 201 | 202 | audio, 203 | video { 204 | display: inline-block; 205 | } 206 | 207 | /** 208 | * Add the correct display in iOS 4-7. 209 | */ 210 | 211 | audio:not([controls]) { 212 | display: none; 213 | height: 0; 214 | } 215 | 216 | /** 217 | * Remove the border on images inside links in IE 10-. 218 | */ 219 | 220 | img { 221 | border-style: none; 222 | } 223 | 224 | /** 225 | * Hide the overflow in IE. 226 | */ 227 | 228 | svg:not(:root) { 229 | overflow: hidden; 230 | } 231 | 232 | /* Forms 233 | ========================================================================== */ 234 | 235 | /** 236 | * 1. Change the font styles in all browsers (opinionated). 237 | * 2. Remove the margin in Firefox and Safari. 238 | */ 239 | 240 | button, 241 | input, 242 | optgroup, 243 | select, 244 | textarea { 245 | font-family: sans-serif; /* 1 */ 246 | font-size: 100%; /* 1 */ 247 | line-height: 1.15; /* 1 */ 248 | margin: 0; /* 2 */ 249 | } 250 | 251 | /** 252 | * Show the overflow in IE. 253 | * 1. Show the overflow in Edge. 254 | */ 255 | 256 | button, 257 | input { /* 1 */ 258 | overflow: visible; 259 | } 260 | 261 | /** 262 | * Remove the inheritance of text transform in Edge, Firefox, and IE. 263 | * 1. Remove the inheritance of text transform in Firefox. 264 | */ 265 | 266 | button, 267 | select { /* 1 */ 268 | text-transform: none; 269 | } 270 | 271 | /** 272 | * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` 273 | * controls in Android 4. 274 | * 2. Correct the inability to style clickable types in iOS and Safari. 275 | */ 276 | 277 | button, 278 | html [type="button"], /* 1 */ 279 | [type="reset"], 280 | [type="submit"] { 281 | -webkit-appearance: button; /* 2 */ 282 | } 283 | 284 | /** 285 | * Remove the inner border and padding in Firefox. 286 | */ 287 | 288 | button::-moz-focus-inner, 289 | [type="button"]::-moz-focus-inner, 290 | [type="reset"]::-moz-focus-inner, 291 | [type="submit"]::-moz-focus-inner { 292 | border-style: none; 293 | padding: 0; 294 | } 295 | 296 | /** 297 | * Restore the focus styles unset by the previous rule. 298 | */ 299 | 300 | button:-moz-focusring, 301 | [type="button"]:-moz-focusring, 302 | [type="reset"]:-moz-focusring, 303 | [type="submit"]:-moz-focusring { 304 | outline: 1px dotted ButtonText; 305 | } 306 | 307 | /** 308 | * Correct the padding in Firefox. 309 | */ 310 | 311 | fieldset { 312 | padding: 0.35em 0.75em 0.625em; 313 | } 314 | 315 | /** 316 | * 1. Correct the text wrapping in Edge and IE. 317 | * 2. Correct the color inheritance from `fieldset` elements in IE. 318 | * 3. Remove the padding so developers are not caught out when they zero out 319 | * `fieldset` elements in all browsers. 320 | */ 321 | 322 | legend { 323 | box-sizing: border-box; /* 1 */ 324 | color: inherit; /* 2 */ 325 | display: table; /* 1 */ 326 | max-width: 100%; /* 1 */ 327 | padding: 0; /* 3 */ 328 | white-space: normal; /* 1 */ 329 | } 330 | 331 | /** 332 | * 1. Add the correct display in IE 9-. 333 | * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. 334 | */ 335 | 336 | progress { 337 | display: inline-block; /* 1 */ 338 | vertical-align: baseline; /* 2 */ 339 | } 340 | 341 | /** 342 | * Remove the default vertical scrollbar in IE. 343 | */ 344 | 345 | textarea { 346 | overflow: auto; 347 | } 348 | 349 | /** 350 | * 1. Add the correct box sizing in IE 10-. 351 | * 2. Remove the padding in IE 10-. 352 | */ 353 | 354 | [type="checkbox"], 355 | [type="radio"] { 356 | box-sizing: border-box; /* 1 */ 357 | padding: 0; /* 2 */ 358 | } 359 | 360 | /** 361 | * Correct the cursor style of increment and decrement buttons in Chrome. 362 | */ 363 | 364 | [type="number"]::-webkit-inner-spin-button, 365 | [type="number"]::-webkit-outer-spin-button { 366 | height: auto; 367 | } 368 | 369 | /** 370 | * 1. Correct the odd appearance in Chrome and Safari. 371 | * 2. Correct the outline style in Safari. 372 | */ 373 | 374 | [type="search"] { 375 | -webkit-appearance: textfield; /* 1 */ 376 | outline-offset: -2px; /* 2 */ 377 | } 378 | 379 | /** 380 | * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. 381 | */ 382 | 383 | [type="search"]::-webkit-search-cancel-button, 384 | [type="search"]::-webkit-search-decoration { 385 | -webkit-appearance: none; 386 | } 387 | 388 | /** 389 | * 1. Correct the inability to style clickable types in iOS and Safari. 390 | * 2. Change font properties to `inherit` in Safari. 391 | */ 392 | 393 | ::-webkit-file-upload-button { 394 | -webkit-appearance: button; /* 1 */ 395 | font: inherit; /* 2 */ 396 | } 397 | 398 | /* Interactive 399 | ========================================================================== */ 400 | 401 | /* 402 | * Add the correct display in IE 9-. 403 | * 1. Add the correct display in Edge, IE, and Firefox. 404 | */ 405 | 406 | details, /* 1 */ 407 | menu { 408 | display: block; 409 | } 410 | 411 | /* 412 | * Add the correct display in all browsers. 413 | */ 414 | 415 | summary { 416 | display: list-item; 417 | } 418 | 419 | /* Scripting 420 | ========================================================================== */ 421 | 422 | /** 423 | * Add the correct display in IE 9-. 424 | */ 425 | 426 | canvas { 427 | display: inline-block; 428 | } 429 | 430 | /** 431 | * Add the correct display in IE. 432 | */ 433 | 434 | template { 435 | display: none; 436 | } 437 | 438 | /* Hidden 439 | ========================================================================== */ 440 | 441 | /** 442 | * Add the correct display in IE 10-. 443 | */ 444 | 445 | [hidden] { 446 | display: none; 447 | } 448 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_pulse.scss: -------------------------------------------------------------------------------- 1 | .pulse { 2 | &::before { 3 | content: ''; 4 | display: block; 5 | position: absolute; 6 | width: 100%; 7 | height: 100%; 8 | top: 0; 9 | left: 0; 10 | background-color: inherit; 11 | border-radius: inherit; 12 | transition: opacity .3s, transform .3s; 13 | animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; 14 | z-index: -1; 15 | } 16 | 17 | overflow: visible; 18 | position: relative; 19 | } 20 | 21 | @keyframes pulse-animation { 22 | 0% { 23 | opacity: 1; 24 | transform: scale(1); 25 | } 26 | 50% { 27 | opacity: 0; 28 | transform: scale(1.5); 29 | } 30 | 100% { 31 | opacity: 0; 32 | transform: scale(1.5); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_sidenav.scss: -------------------------------------------------------------------------------- 1 | .sidenav { 2 | position: fixed; 3 | width: 300px; 4 | left: 0; 5 | top: 0; 6 | margin: 0; 7 | transform: translateX(-100%); 8 | height: 100%; 9 | height: calc(100% + 60px); 10 | height: -moz-calc(100%); //Temporary Firefox Fix 11 | padding-bottom: 60px; 12 | background-color: $sidenav-bg-color; 13 | z-index: 999; 14 | overflow-y: auto; 15 | will-change: transform; 16 | backface-visibility: hidden; 17 | transform: translateX(-105%); 18 | 19 | @extend .z-depth-1; 20 | 21 | // Right Align 22 | &.right-aligned { 23 | right: 0; 24 | transform: translateX(105%); 25 | left: auto; 26 | transform: translateX(100%); 27 | } 28 | 29 | .collapsible { 30 | margin: 0; 31 | } 32 | 33 | 34 | li { 35 | float: none; 36 | line-height: $sidenav-line-height; 37 | 38 | &.active { background-color: rgba(0,0,0,.05); } 39 | } 40 | 41 | li > a { 42 | color: $sidenav-font-color; 43 | display: block; 44 | font-size: $sidenav-font-size; 45 | font-weight: 500; 46 | height: $sidenav-item-height; 47 | line-height: $sidenav-line-height; 48 | padding: 0 ($sidenav-padding * 2); 49 | 50 | &:hover { background-color: rgba(0,0,0,.05);} 51 | 52 | &.btn, &.btn-large, &.btn-flat, &.btn-floating { 53 | margin: 10px 15px; 54 | } 55 | 56 | &.btn, 57 | &.btn-large, 58 | &.btn-floating { color: $button-raised-color; } 59 | &.btn-flat { color: $button-flat-color; } 60 | 61 | &.btn:hover, 62 | &.btn-large:hover { background-color: lighten($button-raised-background, 5%); } 63 | &.btn-floating:hover { background-color: $button-raised-background; } 64 | 65 | & > i, 66 | & > [class^="mdi-"], li > a > [class*="mdi-"], 67 | & > i.material-icons { 68 | float: left; 69 | height: $sidenav-item-height; 70 | line-height: $sidenav-line-height; 71 | margin: 0 ($sidenav-padding * 2) 0 0; 72 | width: $sidenav-item-height / 2; 73 | color: rgba(0,0,0,.54); 74 | } 75 | } 76 | 77 | 78 | .divider { 79 | margin: ($sidenav-padding / 2) 0 0 0; 80 | } 81 | 82 | .subheader { 83 | &:hover { 84 | background-color: transparent; 85 | } 86 | 87 | cursor: initial; 88 | pointer-events: none; 89 | color: rgba(0,0,0,.54); 90 | font-size: $sidenav-font-size; 91 | font-weight: 500; 92 | line-height: $sidenav-line-height; 93 | } 94 | 95 | .user-view { 96 | position: relative; 97 | padding: ($sidenav-padding * 2) ($sidenav-padding * 2) 0; 98 | margin-bottom: $sidenav-padding / 2; 99 | 100 | & > a { 101 | &:hover { background-color: transparent; } 102 | height: auto; 103 | padding: 0; 104 | } 105 | 106 | .background { 107 | overflow: hidden; 108 | position: absolute; 109 | top: 0; 110 | right: 0; 111 | bottom: 0; 112 | left: 0; 113 | z-index: -1; 114 | } 115 | 116 | .circle, .name, .email { 117 | display: block; 118 | } 119 | 120 | .circle { 121 | height: 64px; 122 | width: 64px; 123 | } 124 | 125 | .name, 126 | .email { 127 | font-size: $sidenav-font-size; 128 | line-height: $sidenav-line-height / 2; 129 | } 130 | 131 | .name { 132 | margin-top: 16px; 133 | font-weight: 500; 134 | } 135 | 136 | .email { 137 | padding-bottom: 16px; 138 | font-weight: 400; 139 | } 140 | } 141 | } 142 | 143 | 144 | // Touch interaction 145 | .drag-target { 146 | // Right Align 147 | &.right-aligned { 148 | right: 0; 149 | } 150 | 151 | height: 100%; 152 | width: 10px; 153 | position: fixed; 154 | top: 0; 155 | z-index: 998; 156 | } 157 | 158 | 159 | // Fixed Sidenav shown 160 | .sidenav.sidenav-fixed { 161 | // Right Align 162 | &.right-aligned { 163 | right: 0; 164 | left: auto; 165 | } 166 | 167 | left: 0; 168 | transform: translateX(0); 169 | position: fixed; 170 | } 171 | 172 | // Fixed Sidenav hide on smaller 173 | @media #{$medium-and-down} { 174 | .sidenav { 175 | &.sidenav-fixed { 176 | transform: translateX(-105%); 177 | 178 | &.right-aligned { 179 | transform: translateX(105%); 180 | } 181 | } 182 | 183 | > a { 184 | padding: 0 $sidenav-padding; 185 | } 186 | 187 | .user-view { 188 | padding: $sidenav-padding $sidenav-padding 0; 189 | } 190 | } 191 | } 192 | 193 | 194 | .sidenav .collapsible-body > ul:not(.collapsible) > li.active, 195 | .sidenav.sidenav-fixed .collapsible-body > ul:not(.collapsible) > li.active { 196 | background-color: $primary-color; 197 | a { 198 | color: $sidenav-bg-color; 199 | } 200 | } 201 | .sidenav .collapsible-body { 202 | padding: 0; 203 | } 204 | 205 | 206 | .sidenav-overlay { 207 | position: fixed; 208 | top: 0; 209 | left: 0; 210 | right: 0; 211 | opacity: 0; 212 | height: 120vh; 213 | background-color: rgba(0,0,0,.5); 214 | z-index: 997; 215 | display: none; 216 | } 217 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_slider.scss: -------------------------------------------------------------------------------- 1 | .slider { 2 | position: relative; 3 | height: 400px; 4 | width: 100%; 5 | 6 | // Fullscreen slider 7 | &.fullscreen { 8 | height: 100%; 9 | width: 100%; 10 | position: absolute; 11 | top: 0; 12 | left: 0; 13 | right: 0; 14 | bottom: 0; 15 | 16 | ul.slides { 17 | height: 100%; 18 | } 19 | 20 | ul.indicators { 21 | z-index: 2; 22 | bottom: 30px; 23 | } 24 | } 25 | 26 | .slides { 27 | background-color: $slider-bg-color; 28 | margin: 0; 29 | height: 400px; 30 | 31 | li { 32 | opacity: 0; 33 | position: absolute; 34 | top: 0; 35 | left: 0; 36 | z-index: 1; 37 | width: 100%; 38 | height: inherit; 39 | overflow: hidden; 40 | 41 | img { 42 | height: 100%; 43 | width: 100%; 44 | background-size: cover; 45 | background-position: center; 46 | } 47 | 48 | .caption { 49 | color: #fff; 50 | position: absolute; 51 | top: 15%; 52 | left: 15%; 53 | width: 70%; 54 | opacity: 0; 55 | 56 | p { color: $slider-bg-color-light; } 57 | } 58 | 59 | &.active { 60 | z-index: 2; 61 | } 62 | } 63 | } 64 | 65 | 66 | .indicators { 67 | position: absolute; 68 | text-align: center; 69 | left: 0; 70 | right: 0; 71 | bottom: 0; 72 | margin: 0; 73 | 74 | .indicator-item { 75 | display: inline-block; 76 | position: relative; 77 | cursor: pointer; 78 | height: 16px; 79 | width: 16px; 80 | margin: 0 12px; 81 | background-color: $slider-bg-color-light; 82 | 83 | transition: background-color .3s; 84 | border-radius: 50%; 85 | 86 | &.active { 87 | background-color: $slider-indicator-color; 88 | } 89 | } 90 | } 91 | 92 | } -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_table_of_contents.scss: -------------------------------------------------------------------------------- 1 | /*************** 2 | Nav List 3 | ***************/ 4 | .table-of-contents { 5 | &.fixed { 6 | position: fixed; 7 | } 8 | 9 | li { 10 | padding: 2px 0; 11 | } 12 | a { 13 | display: inline-block; 14 | font-weight: 300; 15 | color: #757575; 16 | padding-left: 16px; 17 | height: 1.5rem; 18 | line-height: 1.5rem; 19 | letter-spacing: .4; 20 | display: inline-block; 21 | 22 | &:hover { 23 | color: lighten(#757575, 20%); 24 | padding-left: 15px; 25 | border-left: 1px solid $primary-color; 26 | } 27 | &.active { 28 | font-weight: 500; 29 | padding-left: 14px; 30 | border-left: 2px solid $primary-color; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_tabs.scss: -------------------------------------------------------------------------------- 1 | .tabs { 2 | &.tabs-transparent { 3 | background-color: transparent; 4 | 5 | .tab a, 6 | .tab.disabled a, 7 | .tab.disabled a:hover { 8 | color: rgba(255,255,255,0.7); 9 | } 10 | 11 | .tab a:hover, 12 | .tab a.active { 13 | color: #fff; 14 | } 15 | 16 | .indicator { 17 | background-color: #fff; 18 | } 19 | } 20 | 21 | &.tabs-fixed-width { 22 | display: flex; 23 | 24 | .tab { 25 | flex-grow: 1; 26 | } 27 | } 28 | 29 | position: relative; 30 | overflow-x: auto; 31 | overflow-y: hidden; 32 | height: 48px; 33 | width: 100%; 34 | background-color: $tabs-bg-color; 35 | margin: 0 auto; 36 | white-space: nowrap; 37 | 38 | .tab { 39 | display: inline-block; 40 | text-align: center; 41 | line-height: 48px; 42 | height: 48px; 43 | padding: 0; 44 | margin: 0; 45 | text-transform: uppercase; 46 | 47 | a { 48 | &:focus, 49 | &:focus.active { 50 | background-color: transparentize($tabs-underline-color, .8); 51 | outline: none; 52 | } 53 | 54 | &:hover, 55 | &.active { 56 | background-color: transparent; 57 | color: $tabs-text-color; 58 | } 59 | 60 | color: rgba($tabs-text-color, .7); 61 | display: block; 62 | width: 100%; 63 | height: 100%; 64 | padding: 0 24px; 65 | font-size: 14px; 66 | text-overflow: ellipsis; 67 | overflow: hidden; 68 | transition: color .28s ease, background-color .28s ease; 69 | } 70 | 71 | &.disabled a, 72 | &.disabled a:hover { 73 | color: rgba($tabs-text-color, .4); 74 | cursor: default; 75 | } 76 | } 77 | .indicator { 78 | position: absolute; 79 | bottom: 0; 80 | height: 2px; 81 | background-color: $tabs-underline-color; 82 | will-change: left, right; 83 | } 84 | } 85 | 86 | // Fixed Sidenav hide on smaller 87 | @media #{$medium-and-down} { 88 | .tabs { 89 | display: flex; 90 | 91 | .tab { 92 | flex-grow: 1; 93 | 94 | a { 95 | padding: 0 12px; 96 | } 97 | } 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_tapTarget.scss: -------------------------------------------------------------------------------- 1 | .tap-target-wrapper { 2 | width: 800px; 3 | height: 800px; 4 | position: fixed; 5 | z-index: 1000; 6 | visibility: hidden; 7 | transition: visibility 0s .3s; 8 | } 9 | 10 | .tap-target-wrapper.open { 11 | visibility: visible; 12 | transition: visibility 0s; 13 | 14 | .tap-target { 15 | transform: scale(1); 16 | opacity: .95; 17 | transition: 18 | transform .3s cubic-bezier(.42,0,.58,1), 19 | opacity .3s cubic-bezier(.42,0,.58,1); 20 | } 21 | 22 | .tap-target-wave::before { 23 | transform: scale(1); 24 | } 25 | .tap-target-wave::after { 26 | visibility: visible; 27 | animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; 28 | transition: 29 | opacity .3s, 30 | transform .3s, 31 | visibility 0s 1s; 32 | } 33 | } 34 | 35 | .tap-target { 36 | position: absolute; 37 | font-size: 1rem; 38 | border-radius: 50%; 39 | background-color: $primary-color; 40 | box-shadow: 0 20px 20px 0 rgba(0,0,0,0.14), 0 10px 50px 0 rgba(0,0,0,0.12), 0 30px 10px -20px rgba(0,0,0,0.2); 41 | width: 100%; 42 | height: 100%; 43 | opacity: 0; 44 | transform: scale(0); 45 | transition: 46 | transform .3s cubic-bezier(.42,0,.58,1), 47 | opacity .3s cubic-bezier(.42,0,.58,1); 48 | } 49 | 50 | .tap-target-content { 51 | position: relative; 52 | display: table-cell; 53 | } 54 | 55 | .tap-target-wave { 56 | &::before, 57 | &::after { 58 | content: ''; 59 | display: block; 60 | position: absolute; 61 | width: 100%; 62 | height: 100%; 63 | border-radius: 50%; 64 | background-color: #ffffff; 65 | } 66 | &::before { 67 | transform: scale(0); 68 | transition: transform .3s; 69 | } 70 | &::after { 71 | visibility: hidden; 72 | transition: 73 | opacity .3s, 74 | transform .3s, 75 | visibility 0s; 76 | z-index: -1; 77 | } 78 | 79 | position: absolute; 80 | border-radius: 50%; 81 | z-index: 10001; 82 | } 83 | 84 | .tap-target-origin { 85 | &:not(.btn), 86 | &:not(.btn):hover { 87 | background: none; 88 | } 89 | 90 | top: 50%; 91 | left: 50%; 92 | transform: translate(-50%,-50%); 93 | 94 | z-index: 10002; 95 | position: absolute !important; 96 | } 97 | 98 | @media only screen and (max-width: 600px) { 99 | .tap-target, .tap-target-wrapper { 100 | width: 600px; 101 | height: 600px; 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_timepicker.scss: -------------------------------------------------------------------------------- 1 | /* Timepicker Containers */ 2 | .timepicker-modal { 3 | max-width: 325px; 4 | max-height: none; 5 | } 6 | 7 | .timepicker-container.modal-content { 8 | display: flex; 9 | flex-direction: column; 10 | padding: 0; 11 | } 12 | 13 | .text-primary { 14 | color: rgba(255, 255, 255, 1); 15 | } 16 | 17 | 18 | /* Clock Digital Display */ 19 | .timepicker-digital-display { 20 | flex: 1 auto; 21 | background-color: $secondary-color; 22 | padding: 10px; 23 | font-weight: 300; 24 | } 25 | 26 | .timepicker-text-container { 27 | font-size: 4rem; 28 | font-weight: bold; 29 | text-align: center; 30 | color: rgba(255, 255, 255, 0.6); 31 | font-weight: 400; 32 | position: relative; 33 | user-select: none; 34 | } 35 | 36 | .timepicker-span-hours, 37 | .timepicker-span-minutes, 38 | .timepicker-span-am-pm div { 39 | cursor: pointer; 40 | } 41 | 42 | .timepicker-span-hours { 43 | margin-right: 3px; 44 | } 45 | 46 | .timepicker-span-minutes { 47 | margin-left: 3px; 48 | } 49 | 50 | .timepicker-display-am-pm { 51 | font-size: 1.3rem; 52 | position: absolute; 53 | right: 1rem; 54 | bottom: 1rem; 55 | font-weight: 400; 56 | } 57 | 58 | 59 | /* Analog Clock Display */ 60 | .timepicker-analog-display { 61 | flex: 2.5 auto; 62 | } 63 | 64 | .timepicker-plate { 65 | background-color: $timepicker-clock-plate-bg; 66 | border-radius: 50%; 67 | width: 270px; 68 | height: 270px; 69 | overflow: visible; 70 | position: relative; 71 | margin: auto; 72 | margin-top: 25px; 73 | margin-bottom: 5px; 74 | user-select: none; 75 | } 76 | 77 | .timepicker-canvas, 78 | .timepicker-dial { 79 | position: absolute; 80 | left: 0; 81 | right: 0; 82 | top: 0; 83 | bottom: 0; 84 | } 85 | .timepicker-minutes { 86 | visibility: hidden; 87 | } 88 | 89 | .timepicker-tick { 90 | border-radius: 50%; 91 | color: $timepicker-clock-color; 92 | line-height: 40px; 93 | text-align: center; 94 | width: 40px; 95 | height: 40px; 96 | position: absolute; 97 | cursor: pointer; 98 | font-size: 15px; 99 | } 100 | 101 | .timepicker-tick.active, 102 | .timepicker-tick:hover { 103 | background-color: transparentize($secondary-color, .75); 104 | } 105 | .timepicker-dial { 106 | transition: transform 350ms, opacity 350ms; 107 | } 108 | .timepicker-dial-out { 109 | &.timepicker-hours { 110 | transform: scale(1.1, 1.1); 111 | } 112 | 113 | &.timepicker-minutes { 114 | transform: scale(.8, .8); 115 | } 116 | 117 | opacity: 0; 118 | } 119 | .timepicker-canvas { 120 | transition: opacity 175ms; 121 | 122 | line { 123 | stroke: $secondary-color; 124 | stroke-width: 4; 125 | stroke-linecap: round; 126 | } 127 | } 128 | .timepicker-canvas-out { 129 | opacity: 0.25; 130 | } 131 | .timepicker-canvas-bearing { 132 | stroke: none; 133 | fill: $secondary-color; 134 | } 135 | .timepicker-canvas-bg { 136 | stroke: none; 137 | fill: $secondary-color; 138 | } 139 | 140 | 141 | /* Footer */ 142 | .timepicker-footer { 143 | margin: 0 auto; 144 | padding: 5px 1rem; 145 | display: flex; 146 | justify-content: space-between; 147 | } 148 | 149 | .timepicker-clear { 150 | color: $error-color; 151 | } 152 | 153 | .timepicker-close { 154 | color: $secondary-color; 155 | } 156 | 157 | .timepicker-clear, 158 | .timepicker-close { 159 | padding: 0 20px; 160 | } 161 | 162 | /* Media Queries */ 163 | @media #{$medium-and-up} { 164 | .timepicker-modal { 165 | max-width: 600px; 166 | } 167 | 168 | .timepicker-container.modal-content { 169 | flex-direction: row; 170 | } 171 | 172 | .timepicker-text-container { 173 | top: 32%; 174 | } 175 | 176 | .timepicker-display-am-pm { 177 | position: relative; 178 | right: auto; 179 | bottom: auto; 180 | text-align: center; 181 | margin-top: 1.2rem; 182 | } 183 | } 184 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_toast.scss: -------------------------------------------------------------------------------- 1 | #toast-container { 2 | display:block; 3 | position: fixed; 4 | z-index: 10000; 5 | 6 | @media #{$small-and-down} { 7 | min-width: 100%; 8 | bottom: 0%; 9 | } 10 | @media #{$medium-only} { 11 | left: 5%; 12 | bottom: 7%; 13 | max-width: 90%; 14 | } 15 | @media #{$large-and-up} { 16 | top: 10%; 17 | right: 7%; 18 | max-width: 86%; 19 | } 20 | } 21 | 22 | .toast { 23 | @extend .z-depth-1; 24 | border-radius: 2px; 25 | top: 35px; 26 | width: auto; 27 | margin-top: 10px; 28 | position: relative; 29 | max-width:100%; 30 | height: auto; 31 | min-height: $toast-height; 32 | line-height: 1.5em; 33 | word-break: break-all; 34 | background-color: $toast-color; 35 | padding: 10px 25px; 36 | font-size: 1.1rem; 37 | font-weight: 300; 38 | color: $toast-text-color; 39 | display: flex; 40 | align-items: center; 41 | justify-content: space-between; 42 | cursor: default; 43 | 44 | .toast-action { 45 | color: $toast-action-color; 46 | font-weight: 500; 47 | margin-right: -25px; 48 | margin-left: 3rem; 49 | } 50 | 51 | &.rounded{ 52 | border-radius: 24px; 53 | } 54 | 55 | @media #{$small-and-down} { 56 | width: 100%; 57 | border-radius: 0; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_tooltip.scss: -------------------------------------------------------------------------------- 1 | .material-tooltip { 2 | padding: 10px 8px; 3 | font-size: 1rem; 4 | z-index: 2000; 5 | background-color: transparent; 6 | border-radius: 2px; 7 | color: #fff; 8 | min-height: 36px; 9 | line-height: 120%; 10 | opacity: 0; 11 | position: absolute; 12 | text-align: center; 13 | max-width: calc(100% - 4px); 14 | overflow: hidden; 15 | left: 0; 16 | top: 0; 17 | pointer-events: none; 18 | visibility: hidden; 19 | background-color: #323232; 20 | } 21 | 22 | .backdrop { 23 | position: absolute; 24 | opacity: 0; 25 | height: 7px; 26 | width: 14px; 27 | border-radius: 0 0 50% 50%; 28 | background-color: #323232; 29 | z-index: -1; 30 | transform-origin: 50% 0%; 31 | visibility: hidden; 32 | } 33 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_transitions.scss: -------------------------------------------------------------------------------- 1 | // Scale transition 2 | .scale-transition { 3 | &.scale-out { 4 | transform: scale(0); 5 | transition: transform .2s !important; 6 | } 7 | 8 | &.scale-in { 9 | transform: scale(1); 10 | } 11 | 12 | transition: transform .3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important; 13 | } -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_typography.scss: -------------------------------------------------------------------------------- 1 | 2 | a { 3 | text-decoration: none; 4 | } 5 | 6 | html{ 7 | line-height: 1.5; 8 | 9 | @media only screen and (min-width: 0) { 10 | font-size: 14px; 11 | } 12 | 13 | @media only screen and (min-width: $medium-screen) { 14 | font-size: 14.5px; 15 | } 16 | 17 | @media only screen and (min-width: $large-screen) { 18 | font-size: 15px; 19 | } 20 | 21 | font-family: $font-stack; 22 | font-weight: normal; 23 | color: $off-black; 24 | } 25 | h1, h2, h3, h4, h5, h6 { 26 | font-weight: 400; 27 | line-height: 1.3; 28 | } 29 | 30 | // Header Styles 31 | h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { font-weight: inherit; } 32 | h1 { font-size: $h1-fontsize; line-height: 110%; margin: ($h1-fontsize / 1.5) 0 ($h1-fontsize / 2.5) 0;} 33 | h2 { font-size: $h2-fontsize; line-height: 110%; margin: ($h2-fontsize / 1.5) 0 ($h2-fontsize / 2.5) 0;} 34 | h3 { font-size: $h3-fontsize; line-height: 110%; margin: ($h3-fontsize / 1.5) 0 ($h3-fontsize / 2.5) 0;} 35 | h4 { font-size: $h4-fontsize; line-height: 110%; margin: ($h4-fontsize / 1.5) 0 ($h4-fontsize / 2.5) 0;} 36 | h5 { font-size: $h5-fontsize; line-height: 110%; margin: ($h5-fontsize / 1.5) 0 ($h5-fontsize / 2.5) 0;} 37 | h6 { font-size: $h6-fontsize; line-height: 110%; margin: ($h6-fontsize / 1.5) 0 ($h6-fontsize / 2.5) 0;} 38 | 39 | // Text Styles 40 | em { font-style: italic; } 41 | strong { font-weight: 500; } 42 | small { font-size: 75%; } 43 | .light { font-weight: 300; } 44 | .thin { font-weight: 200; } 45 | 46 | 47 | .flow-text{ 48 | $i: 0; 49 | @while $i <= $intervals { 50 | @media only screen and (min-width : 360 + ($i * $interval-size)) { 51 | font-size: 1.2rem * (1 + (.02 * $i)); 52 | } 53 | $i: $i + 1; 54 | } 55 | 56 | // Handle below 360px screen 57 | @media only screen and (max-width: 360px) { 58 | font-size: 1.2rem; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/_waves.scss: -------------------------------------------------------------------------------- 1 | 2 | /*! 3 | * Waves v0.6.0 4 | * http://fian.my.id/Waves 5 | * 6 | * Copyright 2014 Alfiana E. Sibuea and other contributors 7 | * Released under the MIT license 8 | * https://github.com/fians/Waves/blob/master/LICENSE 9 | */ 10 | 11 | 12 | .waves-effect { 13 | position: relative; 14 | cursor: pointer; 15 | display: inline-block; 16 | overflow: hidden; 17 | user-select: none; 18 | -webkit-tap-highlight-color: transparent; 19 | vertical-align: middle; 20 | z-index: 1; 21 | transition: .3s ease-out; 22 | 23 | .waves-ripple { 24 | position: absolute; 25 | border-radius: 50%; 26 | width: 20px; 27 | height: 20px; 28 | margin-top:-10px; 29 | margin-left:-10px; 30 | opacity: 0; 31 | 32 | background: rgba(0,0,0,0.2); 33 | transition: all 0.7s ease-out; 34 | transition-property: transform, opacity; 35 | transform: scale(0); 36 | pointer-events: none; 37 | } 38 | 39 | // Waves Colors 40 | &.waves-light .waves-ripple { 41 | background-color: rgba(255, 255, 255, 0.45); 42 | } 43 | &.waves-red .waves-ripple { 44 | background-color: rgba(244, 67, 54, .70); 45 | } 46 | &.waves-yellow .waves-ripple { 47 | background-color: rgba(255, 235, 59, .70); 48 | } 49 | &.waves-orange .waves-ripple { 50 | background-color: rgba(255, 152, 0, .70); 51 | } 52 | &.waves-purple .waves-ripple { 53 | background-color: rgba(156, 39, 176, 0.70); 54 | } 55 | &.waves-green .waves-ripple { 56 | background-color: rgba(76, 175, 80, 0.70); 57 | } 58 | &.waves-teal .waves-ripple { 59 | background-color: rgba(0, 150, 136, 0.70); 60 | } 61 | 62 | // Style input button bug. 63 | input[type="button"], input[type="reset"], input[type="submit"] { 64 | border: 0; 65 | font-style: normal; 66 | font-size: inherit; 67 | text-transform: inherit; 68 | background: none; 69 | } 70 | 71 | img { 72 | position: relative; 73 | z-index: -1; 74 | } 75 | } 76 | 77 | .waves-notransition { 78 | transition: none #{"!important"}; 79 | } 80 | 81 | .waves-circle { 82 | transform: translateZ(0); 83 | -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%); 84 | } 85 | 86 | .waves-input-wrapper { 87 | border-radius: 0.2em; 88 | vertical-align: bottom; 89 | 90 | .waves-button-input { 91 | position: relative; 92 | top: 0; 93 | left: 0; 94 | z-index: 1; 95 | } 96 | } 97 | 98 | .waves-circle { 99 | text-align: center; 100 | width: 2.5em; 101 | height: 2.5em; 102 | line-height: 2.5em; 103 | border-radius: 50%; 104 | -webkit-mask-image: none; 105 | } 106 | 107 | .waves-block { 108 | display: block; 109 | } 110 | 111 | /* Firefox Bug: link not triggered */ 112 | .waves-effect .waves-ripple { 113 | z-index: -1; 114 | } -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/forms/_checkboxes.scss: -------------------------------------------------------------------------------- 1 | /* Checkboxes 2 | ========================================================================== */ 3 | 4 | /* Remove default checkbox */ 5 | [type="checkbox"]:not(:checked), 6 | [type="checkbox"]:checked { 7 | position: absolute; 8 | opacity: 0; 9 | pointer-events: none; 10 | } 11 | 12 | // Checkbox Styles 13 | [type="checkbox"] { 14 | // Text Label Style 15 | + span:not(.lever) { 16 | position: relative; 17 | padding-left: 35px; 18 | cursor: pointer; 19 | display: inline-block; 20 | height: 25px; 21 | line-height: 25px; 22 | font-size: 1rem; 23 | user-select: none; 24 | } 25 | 26 | /* checkbox aspect */ 27 | + span:not(.lever):before, 28 | &:not(.filled-in) + span:not(.lever):after { 29 | content: ''; 30 | position: absolute; 31 | top: 0; 32 | left: 0; 33 | width: 18px; 34 | height: 18px; 35 | z-index: 0; 36 | border: 2px solid $radio-empty-color; 37 | border-radius: 1px; 38 | margin-top: 3px; 39 | transition: .2s; 40 | } 41 | 42 | &:not(.filled-in) + span:not(.lever):after { 43 | border: 0; 44 | transform: scale(0); 45 | } 46 | 47 | &:not(:checked):disabled + span:not(.lever):before { 48 | border: none; 49 | background-color: $input-disabled-color; 50 | } 51 | 52 | // Focused styles 53 | &.tabbed:focus + span:not(.lever):after { 54 | transform: scale(1); 55 | border: 0; 56 | border-radius: 50%; 57 | box-shadow: 0 0 0 10px rgba(0,0,0,.1); 58 | background-color: rgba(0,0,0,.1); 59 | } 60 | } 61 | 62 | [type="checkbox"]:checked { 63 | + span:not(.lever):before { 64 | top: -4px; 65 | left: -5px; 66 | width: 12px; 67 | height: 22px; 68 | border-top: 2px solid transparent; 69 | border-left: 2px solid transparent; 70 | border-right: $radio-border; 71 | border-bottom: $radio-border; 72 | transform: rotate(40deg); 73 | backface-visibility: hidden; 74 | transform-origin: 100% 100%; 75 | } 76 | 77 | &:disabled + span:before { 78 | border-right: 2px solid $input-disabled-color; 79 | border-bottom: 2px solid $input-disabled-color; 80 | } 81 | } 82 | 83 | /* Indeterminate checkbox */ 84 | [type="checkbox"]:indeterminate { 85 | + span:not(.lever):before { 86 | top: -11px; 87 | left: -12px; 88 | width: 10px; 89 | height: 22px; 90 | border-top: none; 91 | border-left: none; 92 | border-right: $radio-border; 93 | border-bottom: none; 94 | transform: rotate(90deg); 95 | backface-visibility: hidden; 96 | transform-origin: 100% 100%; 97 | } 98 | 99 | // Disabled indeterminate 100 | &:disabled + span:not(.lever):before { 101 | border-right: 2px solid $input-disabled-color; 102 | background-color: transparent; 103 | } 104 | } 105 | 106 | // Filled in Style 107 | [type="checkbox"].filled-in { 108 | // General 109 | + span:not(.lever):after { 110 | border-radius: 2px; 111 | } 112 | 113 | + span:not(.lever):before, 114 | + span:not(.lever):after { 115 | content: ''; 116 | left: 0; 117 | position: absolute; 118 | /* .1s delay is for check animation */ 119 | transition: border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s; 120 | z-index: 1; 121 | } 122 | 123 | // Unchecked style 124 | &:not(:checked) + span:not(.lever):before { 125 | width: 0; 126 | height: 0; 127 | border: 3px solid transparent; 128 | left: 6px; 129 | top: 10px; 130 | transform: rotateZ(37deg); 131 | transform-origin: 100% 100%; 132 | } 133 | 134 | &:not(:checked) + span:not(.lever):after { 135 | height: 20px; 136 | width: 20px; 137 | background-color: transparent; 138 | border: 2px solid $radio-empty-color; 139 | top: 0px; 140 | z-index: 0; 141 | } 142 | 143 | // Checked style 144 | &:checked { 145 | + span:not(.lever):before { 146 | top: 0; 147 | left: 1px; 148 | width: 8px; 149 | height: 13px; 150 | border-top: 2px solid transparent; 151 | border-left: 2px solid transparent; 152 | border-right: 2px solid $input-background; 153 | border-bottom: 2px solid $input-background; 154 | transform: rotateZ(37deg); 155 | transform-origin: 100% 100%; 156 | } 157 | 158 | + span:not(.lever):after { 159 | top: 0; 160 | width: 20px; 161 | height: 20px; 162 | border: 2px solid $secondary-color; 163 | background-color: $secondary-color; 164 | z-index: 0; 165 | } 166 | } 167 | 168 | // Focused styles 169 | &.tabbed:focus + span:not(.lever):after { 170 | border-radius: 2px; 171 | border-color: $radio-empty-color; 172 | background-color: rgba(0,0,0,.1); 173 | } 174 | 175 | &.tabbed:checked:focus + span:not(.lever):after { 176 | border-radius: 2px; 177 | background-color: $secondary-color; 178 | border-color: $secondary-color; 179 | } 180 | 181 | // Disabled style 182 | &:disabled:not(:checked) + span:not(.lever):before { 183 | background-color: transparent; 184 | border: 2px solid transparent; 185 | } 186 | 187 | &:disabled:not(:checked) + span:not(.lever):after { 188 | border-color: transparent; 189 | background-color: $input-disabled-solid-color; 190 | } 191 | 192 | &:disabled:checked + span:not(.lever):before { 193 | background-color: transparent; 194 | } 195 | 196 | &:disabled:checked + span:not(.lever):after { 197 | background-color: $input-disabled-solid-color; 198 | border-color: $input-disabled-solid-color; 199 | } 200 | } 201 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/forms/_file-input.scss: -------------------------------------------------------------------------------- 1 | /* File Input 2 | ========================================================================== */ 3 | 4 | .file-field { 5 | position: relative; 6 | 7 | .file-path-wrapper { 8 | overflow: hidden; 9 | padding-left: 10px; 10 | } 11 | 12 | input.file-path { width: 100%; } 13 | 14 | .btn { 15 | float: left; 16 | height: $input-height; 17 | line-height: $input-height; 18 | } 19 | 20 | span { 21 | cursor: pointer; 22 | } 23 | 24 | input[type=file] { 25 | 26 | // Needed to override webkit button 27 | &::-webkit-file-upload-button { 28 | display: none; 29 | } 30 | 31 | position: absolute; 32 | top: 0; 33 | right: 0; 34 | left: 0; 35 | bottom: 0; 36 | width: 100%; 37 | margin: 0; 38 | padding: 0; 39 | font-size: 20px; 40 | cursor: pointer; 41 | opacity: 0; 42 | filter: alpha(opacity=0); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/forms/_forms.scss: -------------------------------------------------------------------------------- 1 | // Remove Focus Boxes 2 | select:focus { 3 | outline: $select-focus; 4 | } 5 | 6 | button:focus { 7 | outline: none; 8 | background-color: $button-background-focus; 9 | } 10 | 11 | label { 12 | font-size: $label-font-size; 13 | color: $input-border-color; 14 | } 15 | 16 | @import 'input-fields'; 17 | @import 'radio-buttons'; 18 | @import 'checkboxes'; 19 | @import 'switches'; 20 | @import 'select'; 21 | @import 'file-input'; 22 | @import 'range'; 23 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/forms/_input-fields.scss: -------------------------------------------------------------------------------- 1 | /* Text Inputs + Textarea 2 | ========================================================================== */ 3 | 4 | /* Style Placeholders */ 5 | 6 | ::placeholder { 7 | color: $placeholder-text-color; 8 | } 9 | 10 | /* Text inputs */ 11 | 12 | input:not([type]), 13 | input[type=text]:not(.browser-default), 14 | input[type=password]:not(.browser-default), 15 | input[type=email]:not(.browser-default), 16 | input[type=url]:not(.browser-default), 17 | input[type=time]:not(.browser-default), 18 | input[type=date]:not(.browser-default), 19 | input[type=datetime]:not(.browser-default), 20 | input[type=datetime-local]:not(.browser-default), 21 | input[type=tel]:not(.browser-default), 22 | input[type=number]:not(.browser-default), 23 | input[type=search]:not(.browser-default), 24 | textarea.materialize-textarea { 25 | 26 | // General Styles 27 | background-color: transparent; 28 | border: none; 29 | border-bottom: $input-border; 30 | border-radius: 0; 31 | outline: none; 32 | height: $input-height; 33 | width: 100%; 34 | font-size: $input-font-size; 35 | margin: $input-margin; 36 | padding: $input-padding; 37 | box-shadow: none; 38 | box-sizing: content-box; 39 | transition: box-shadow .3s, border .3s; 40 | 41 | // Disabled input style 42 | &:disabled, 43 | &[readonly="readonly"] { 44 | color: $input-disabled-color; 45 | border-bottom: $input-disabled-border; 46 | } 47 | 48 | // Disabled label style 49 | &:disabled+label, 50 | &[readonly="readonly"]+label { 51 | color: $input-disabled-color; 52 | } 53 | 54 | // Focused input style 55 | &:focus:not([readonly]) { 56 | border-bottom: 1px solid $input-focus-color; 57 | box-shadow: 0 1px 0 0 $input-focus-color; 58 | } 59 | 60 | // Focused label style 61 | &:focus:not([readonly])+label { 62 | color: $input-focus-color; 63 | } 64 | 65 | // Hide helper text on data message 66 | &.valid ~ .helper-text[data-success], 67 | &:focus.valid ~ .helper-text[data-success], 68 | &.invalid ~ .helper-text[data-error], 69 | &:focus.invalid ~ .helper-text[data-error] { 70 | @extend %hidden-text; 71 | } 72 | 73 | // Valid Input Style 74 | &.valid, 75 | &:focus.valid { 76 | @extend %valid-input-style; 77 | } 78 | 79 | // Custom Success Message 80 | &.valid ~ .helper-text:after, 81 | &:focus.valid ~ .helper-text:after { 82 | @extend %custom-success-message; 83 | } 84 | &:focus.valid ~ label { 85 | color: $input-success-color; 86 | } 87 | 88 | // Invalid Input Style 89 | &.invalid, 90 | &:focus.invalid { 91 | @extend %invalid-input-style; 92 | } 93 | 94 | // Custom Error message 95 | &.invalid ~ .helper-text:after, 96 | &:focus.invalid ~ .helper-text:after { 97 | @extend %custom-error-message; 98 | } 99 | &:focus.invalid ~ label { 100 | color: $input-error-color; 101 | } 102 | 103 | // Full width label when using validate for error messages 104 | &.validate + label { 105 | width: 100%; 106 | } 107 | 108 | // Form Message Shared Styles 109 | & + label:after { 110 | @extend %input-after-style; 111 | } 112 | } 113 | 114 | 115 | /* Validation Sass Placeholders */ 116 | %valid-input-style { 117 | border-bottom: 1px solid $input-success-color; 118 | box-shadow: 0 1px 0 0 $input-success-color; 119 | } 120 | %invalid-input-style { 121 | border-bottom: $input-invalid-border; 122 | box-shadow: 0 1px 0 0 $input-error-color; 123 | } 124 | %hidden-text { 125 | color: transparent; 126 | user-select: none; 127 | pointer-events: none; 128 | } 129 | %custom-success-message { 130 | content: attr(data-success); 131 | color: $input-success-color; 132 | } 133 | %custom-error-message { 134 | content: attr(data-error); 135 | color: $input-error-color; 136 | } 137 | %input-after-style { 138 | display: block; 139 | content: ""; 140 | position: absolute; 141 | top: 100%; 142 | left: 0; 143 | opacity: 0; 144 | transition: .2s opacity ease-out, .2s color ease-out; 145 | } 146 | 147 | 148 | // Styling for input field wrapper 149 | .input-field { 150 | // Inline styles 151 | &.inline { 152 | display: inline-block; 153 | vertical-align: middle; 154 | margin-left: 5px; 155 | 156 | input, 157 | .select-dropdown { 158 | margin-bottom: 1rem; 159 | } 160 | } 161 | 162 | // Gutter spacing 163 | &.col { 164 | label { 165 | left: $gutter-width / 2; 166 | } 167 | 168 | .prefix ~ label, 169 | .prefix ~ .validate ~ label { 170 | width: calc(100% - 3rem - #{$gutter-width}); 171 | } 172 | } 173 | 174 | position: relative; 175 | margin-top: 1rem; 176 | margin-bottom: 1rem; 177 | 178 | & > label { 179 | color: $input-border-color; 180 | position: absolute; 181 | top: 0; 182 | left: 0; 183 | font-size: 1rem; 184 | cursor: text; 185 | transition: transform .2s ease-out, color .2s ease-out; 186 | transform-origin: 0% 100%; 187 | text-align: initial; 188 | transform: translateY(12px); 189 | 190 | &:not(.label-icon).active { 191 | transform: translateY(-14px) scale(.8); 192 | transform-origin: 0 0; 193 | } 194 | } 195 | 196 | & > input[type=date]:not(.browser-default) + label, 197 | & > input[type=time]:not(.browser-default) + label { 198 | transform: translateY(-14px) scale(.8); 199 | transform-origin: 0 0; 200 | } 201 | 202 | .helper-text { 203 | &::after { 204 | opacity: 1; 205 | position: absolute; 206 | top: 0; 207 | left: 0; 208 | } 209 | 210 | position: relative; 211 | min-height: 18px; 212 | display: block; 213 | font-size: 12px; 214 | color: rgba(0,0,0,.54); 215 | } 216 | 217 | // Prefix Icons 218 | .prefix { 219 | position: absolute; 220 | width: $input-height; 221 | font-size: $input-icon-size; 222 | transition: color .2s; 223 | top: ($input-height - $input-icon-size) / 2; 224 | 225 | &.active { color: $input-focus-color; } 226 | } 227 | 228 | .prefix ~ input, 229 | .prefix ~ textarea, 230 | .prefix ~ label, 231 | .prefix ~ .validate ~ label, 232 | .prefix ~ .helper-text, 233 | .prefix ~ .autocomplete-content { 234 | margin-left: 3rem; 235 | width: 92%; 236 | width: calc(100% - 3rem); 237 | } 238 | 239 | .prefix ~ label { margin-left: 3rem; } 240 | 241 | @media #{$medium-and-down} { 242 | .prefix ~ input { 243 | width: 86%; 244 | width: calc(100% - 3rem); 245 | } 246 | } 247 | 248 | @media #{$small-and-down} { 249 | .prefix ~ input { 250 | width: 80%; 251 | width: calc(100% - 3rem); 252 | } 253 | } 254 | } 255 | 256 | 257 | /* Search Field */ 258 | 259 | .input-field input[type=search] { 260 | display: block; 261 | line-height: inherit; 262 | transition: .3s background-color; 263 | 264 | .nav-wrapper & { 265 | height: inherit; 266 | padding-left: 4rem; 267 | width: calc(100% - 4rem); 268 | border: 0; 269 | box-shadow: none; 270 | } 271 | 272 | &:focus:not(.browser-default) { 273 | background-color: $input-background; 274 | border: 0; 275 | box-shadow: none; 276 | color: #444; 277 | 278 | & + label i, 279 | & ~ .mdi-navigation-close, 280 | & ~ .material-icons { 281 | color: #444; 282 | } 283 | } 284 | 285 | & + .label-icon { 286 | transform: none; 287 | left: 1rem; 288 | } 289 | 290 | & ~ .mdi-navigation-close, 291 | & ~ .material-icons { 292 | position: absolute; 293 | top: 0; 294 | right: 1rem; 295 | color: transparent; 296 | cursor: pointer; 297 | font-size: $input-icon-size; 298 | transition: .3s color; 299 | } 300 | } 301 | 302 | 303 | /* Textarea */ 304 | 305 | // Default textarea 306 | textarea { 307 | width: 100%; 308 | height: $input-height; 309 | background-color: transparent; 310 | 311 | &.materialize-textarea { 312 | line-height: normal; 313 | overflow-y: hidden; /* prevents scroll bar flash */ 314 | padding: .8rem 0 .8rem 0; /* prevents text jump on Enter keypress */ 315 | resize: none; 316 | min-height: $input-height; 317 | box-sizing: border-box; 318 | } 319 | } 320 | 321 | // For textarea autoresize 322 | .hiddendiv { 323 | visibility: hidden; 324 | white-space: pre-wrap; 325 | word-wrap: break-word; 326 | overflow-wrap: break-word; /* future version of deprecated 'word-wrap' */ 327 | padding-top: 1.2rem; /* prevents text jump on Enter keypress */ 328 | 329 | // Reduces repaints 330 | position: absolute; 331 | top: 0; 332 | z-index: -1; 333 | } 334 | 335 | 336 | /* Autocomplete */ 337 | .autocomplete-content { 338 | li { 339 | .highlight { color: #444; } 340 | 341 | img { 342 | height: $dropdown-item-height - 10; 343 | width: $dropdown-item-height - 10; 344 | margin: 5px 15px; 345 | } 346 | } 347 | } 348 | 349 | /* Character Counter */ 350 | .character-counter { 351 | min-height: 18px; 352 | } 353 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/forms/_radio-buttons.scss: -------------------------------------------------------------------------------- 1 | /* Radio Buttons 2 | ========================================================================== */ 3 | 4 | // Remove default Radio Buttons 5 | [type="radio"]:not(:checked), 6 | [type="radio"]:checked { 7 | position: absolute; 8 | opacity: 0; 9 | pointer-events: none; 10 | } 11 | 12 | [type="radio"]:not(:checked) + span, 13 | [type="radio"]:checked + span { 14 | position: relative; 15 | padding-left: 35px; 16 | cursor: pointer; 17 | display: inline-block; 18 | height: 25px; 19 | line-height: 25px; 20 | font-size: 1rem; 21 | transition: .28s ease; 22 | user-select: none; 23 | } 24 | 25 | [type="radio"] + span:before, 26 | [type="radio"] + span:after { 27 | content: ''; 28 | position: absolute; 29 | left: 0; 30 | top: 0; 31 | margin: 4px; 32 | width: 16px; 33 | height: 16px; 34 | z-index: 0; 35 | transition: .28s ease; 36 | } 37 | 38 | /* Unchecked styles */ 39 | [type="radio"]:not(:checked) + span:before, 40 | [type="radio"]:not(:checked) + span:after, 41 | [type="radio"]:checked + span:before, 42 | [type="radio"]:checked + span:after, 43 | [type="radio"].with-gap:checked + span:before, 44 | [type="radio"].with-gap:checked + span:after { 45 | border-radius: 50%; 46 | } 47 | 48 | [type="radio"]:not(:checked) + span:before, 49 | [type="radio"]:not(:checked) + span:after { 50 | border: 2px solid $radio-empty-color; 51 | } 52 | 53 | [type="radio"]:not(:checked) + span:after { 54 | transform: scale(0); 55 | } 56 | 57 | /* Checked styles */ 58 | [type="radio"]:checked + span:before { 59 | border: 2px solid transparent; 60 | } 61 | 62 | [type="radio"]:checked + span:after, 63 | [type="radio"].with-gap:checked + span:before, 64 | [type="radio"].with-gap:checked + span:after { 65 | border: $radio-border; 66 | } 67 | 68 | [type="radio"]:checked + span:after, 69 | [type="radio"].with-gap:checked + span:after { 70 | background-color: $radio-fill-color; 71 | } 72 | 73 | [type="radio"]:checked + span:after { 74 | transform: scale(1.02); 75 | } 76 | 77 | /* Radio With gap */ 78 | [type="radio"].with-gap:checked + span:after { 79 | transform: scale(.5); 80 | } 81 | 82 | /* Focused styles */ 83 | [type="radio"].tabbed:focus + span:before { 84 | box-shadow: 0 0 0 10px rgba(0,0,0,.1); 85 | } 86 | 87 | /* Disabled Radio With gap */ 88 | [type="radio"].with-gap:disabled:checked + span:before { 89 | border: 2px solid $input-disabled-color; 90 | } 91 | 92 | [type="radio"].with-gap:disabled:checked + span:after { 93 | border: none; 94 | background-color: $input-disabled-color; 95 | } 96 | 97 | /* Disabled style */ 98 | [type="radio"]:disabled:not(:checked) + span:before, 99 | [type="radio"]:disabled:checked + span:before { 100 | background-color: transparent; 101 | border-color: $input-disabled-color; 102 | } 103 | 104 | [type="radio"]:disabled + span { 105 | color: $input-disabled-color; 106 | } 107 | 108 | [type="radio"]:disabled:not(:checked) + span:before { 109 | border-color: $input-disabled-color; 110 | } 111 | 112 | [type="radio"]:disabled:checked + span:after { 113 | background-color: $input-disabled-color; 114 | border-color: $input-disabled-solid-color; 115 | } 116 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/forms/_range.scss: -------------------------------------------------------------------------------- 1 | /* Range 2 | ========================================================================== */ 3 | 4 | .range-field { 5 | position: relative; 6 | } 7 | 8 | input[type=range], 9 | input[type=range] + .thumb { 10 | @extend .no-select; 11 | cursor: pointer; 12 | } 13 | 14 | input[type=range] { 15 | position: relative; 16 | background-color: transparent; 17 | border: none; 18 | outline: none; 19 | width: 100%; 20 | margin: 15px 0; 21 | padding: 0; 22 | 23 | &:focus { 24 | outline: none; 25 | } 26 | } 27 | 28 | input[type=range] + .thumb { 29 | position: absolute; 30 | top: 10px; 31 | left: 0; 32 | border: none; 33 | height: 0; 34 | width: 0; 35 | border-radius: 50%; 36 | background-color: $radio-fill-color; 37 | margin-left: 7px; 38 | 39 | transform-origin: 50% 50%; 40 | transform: rotate(-45deg); 41 | 42 | .value { 43 | display: block; 44 | width: 30px; 45 | text-align: center; 46 | color: $radio-fill-color; 47 | font-size: 0; 48 | transform: rotate(45deg); 49 | } 50 | 51 | &.active { 52 | border-radius: 50% 50% 50% 0; 53 | 54 | .value { 55 | color: $input-background; 56 | margin-left: -1px; 57 | margin-top: 8px; 58 | font-size: 10px; 59 | } 60 | } 61 | } 62 | 63 | // Shared 64 | @mixin range-track { 65 | height: $track-height; 66 | background: #c2c0c2; 67 | border: none; 68 | } 69 | 70 | @mixin range-thumb { 71 | border: none; 72 | height: $range-height; 73 | width: $range-width; 74 | border-radius: 50%; 75 | background: $radio-fill-color; 76 | transition: box-shadow .3s; 77 | } 78 | 79 | // WebKit 80 | input[type=range] { 81 | -webkit-appearance: none; 82 | } 83 | 84 | input[type=range]::-webkit-slider-runnable-track { 85 | @include range-track; 86 | } 87 | 88 | input[type=range]::-webkit-slider-thumb { 89 | @include range-thumb; 90 | -webkit-appearance: none; 91 | background-color: $radio-fill-color; 92 | transform-origin: 50% 50%; 93 | margin: -5px 0 0 0; 94 | 95 | } 96 | 97 | input[type=range].focused:focus:not(.active)::-webkit-slider-thumb { 98 | box-shadow: 0 0 0 10px rgba($radio-fill-color, .26); 99 | } 100 | 101 | // FireFox 102 | input[type=range] { 103 | /* fix for FF unable to apply focus style bug */ 104 | border: 1px solid white; 105 | 106 | /*required for proper track sizing in FF*/ 107 | } 108 | 109 | input[type=range]::-moz-range-track { 110 | @include range-track; 111 | } 112 | 113 | input[type=range]::-moz-focus-inner { 114 | border: 0; 115 | } 116 | 117 | input[type=range]::-moz-range-thumb { 118 | @include range-thumb; 119 | margin-top: -5px; 120 | } 121 | 122 | // hide the outline behind the border 123 | input[type=range]:-moz-focusring { 124 | outline: 1px solid #fff; 125 | outline-offset: -1px; 126 | } 127 | 128 | input[type=range].focused:focus:not(.active)::-moz-range-thumb { 129 | box-shadow: 0 0 0 10px rgba($radio-fill-color, .26); 130 | } 131 | 132 | // IE 10+ 133 | input[type=range]::-ms-track { 134 | height: $track-height; 135 | 136 | // remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead 137 | background: transparent; 138 | 139 | // leave room for the larger thumb to overflow with a transparent border */ 140 | border-color: transparent; 141 | border-width: 6px 0; 142 | 143 | /*remove default tick marks*/ 144 | color: transparent; 145 | } 146 | 147 | input[type=range]::-ms-fill-lower { 148 | background: #777; 149 | } 150 | 151 | input[type=range]::-ms-fill-upper { 152 | background: #ddd; 153 | } 154 | 155 | input[type=range]::-ms-thumb { 156 | @include range-thumb; 157 | } 158 | 159 | input[type=range].focused:focus:not(.active)::-ms-thumb { 160 | box-shadow: 0 0 0 10px rgba($radio-fill-color, .26); 161 | } 162 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/forms/_select.scss: -------------------------------------------------------------------------------- 1 | /* Select Field 2 | ========================================================================== */ 3 | 4 | select { display: none; } 5 | select.browser-default { display: block; } 6 | 7 | select { 8 | background-color: $select-background; 9 | width: 100%; 10 | padding: $select-padding; 11 | border: $select-border; 12 | border-radius: $select-radius; 13 | height: $input-height; 14 | } 15 | 16 | .select-label { 17 | position: absolute; 18 | } 19 | 20 | .select-wrapper { 21 | &.valid .helper-text[data-success], 22 | &.invalid ~ .helper-text[data-error] { 23 | @extend %hidden-text; 24 | } 25 | 26 | &.valid { 27 | & > input.select-dropdown { 28 | @extend %valid-input-style; 29 | } 30 | 31 | & ~ .helper-text:after { 32 | @extend %custom-success-message; 33 | } 34 | } 35 | 36 | &.invalid { 37 | & > input.select-dropdown, 38 | & > input.select-dropdown:focus { 39 | @extend %invalid-input-style; 40 | } 41 | 42 | & ~ .helper-text:after { 43 | @extend %custom-error-message; 44 | } 45 | } 46 | 47 | &.valid + label, 48 | &.invalid + label { 49 | width: 100%; 50 | pointer-events: none; 51 | } 52 | 53 | & + label:after { 54 | @extend %input-after-style; 55 | } 56 | 57 | position: relative; 58 | 59 | input.select-dropdown { 60 | &:focus { 61 | border-bottom: 1px solid $input-focus-color; 62 | } 63 | position: relative; 64 | cursor: pointer; 65 | background-color: transparent; 66 | border: none; 67 | border-bottom: $input-border; 68 | outline: none; 69 | height: $input-height; 70 | line-height: $input-height; 71 | width: 100%; 72 | font-size: $input-font-size; 73 | margin: $input-margin; 74 | padding: 0; 75 | display: block; 76 | user-select:none; 77 | z-index: 1; 78 | } 79 | 80 | .caret { 81 | position: absolute; 82 | right: 0; 83 | top: 0; 84 | bottom: 0; 85 | margin: auto 0; 86 | z-index: 0; 87 | fill: rgba(0,0,0,.87); 88 | } 89 | 90 | & + label { 91 | position: absolute; 92 | top: -26px; 93 | font-size: $label-font-size; 94 | } 95 | } 96 | 97 | // Disabled styles 98 | select:disabled { 99 | color: $input-disabled-color; 100 | } 101 | 102 | .select-wrapper.disabled { 103 | + label { 104 | color: $input-disabled-color; 105 | } 106 | .caret { 107 | fill: $input-disabled-color; 108 | } 109 | } 110 | 111 | .select-wrapper input.select-dropdown:disabled { 112 | color: $input-disabled-color; 113 | cursor: default; 114 | user-select: none; 115 | } 116 | 117 | .select-wrapper i { 118 | color: $select-disabled-color; 119 | } 120 | 121 | .select-dropdown li.disabled, 122 | .select-dropdown li.disabled > span, 123 | .select-dropdown li.optgroup { 124 | color: $select-disabled-color; 125 | background-color: transparent; 126 | } 127 | 128 | .select-dropdown.dropdown-content { 129 | li { 130 | &:hover { 131 | background-color: $select-option-hover; 132 | } 133 | 134 | &.selected { 135 | background-color: $select-option-selected; 136 | } 137 | 138 | &:focus { 139 | background-color: $select-option-focus; 140 | } 141 | } 142 | } 143 | 144 | // Prefix Icons 145 | .prefix ~ .select-wrapper { 146 | margin-left: 3rem; 147 | width: 92%; 148 | width: calc(100% - 3rem); 149 | } 150 | 151 | .prefix ~ label { margin-left: 3rem; } 152 | 153 | // Icons 154 | .select-dropdown li { 155 | img { 156 | height: $dropdown-item-height - 10; 157 | width: $dropdown-item-height - 10; 158 | margin: 5px 15px; 159 | float: right; 160 | } 161 | } 162 | 163 | // Optgroup styles 164 | .select-dropdown li.optgroup { 165 | border-top: 1px solid $dropdown-hover-bg-color; 166 | 167 | &.selected > span { 168 | color: rgba(0, 0, 0, .7); 169 | } 170 | 171 | & > span { 172 | color: rgba(0, 0, 0, .4); 173 | } 174 | 175 | & ~ li.optgroup-option { 176 | padding-left: 1rem; 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/components/forms/_switches.scss: -------------------------------------------------------------------------------- 1 | /* Switch 2 | ========================================================================== */ 3 | 4 | .switch, 5 | .switch * { 6 | -webkit-tap-highlight-color: transparent; 7 | user-select: none; 8 | } 9 | 10 | .switch label { 11 | cursor: pointer; 12 | } 13 | 14 | .switch label input[type=checkbox] { 15 | opacity: 0; 16 | width: 0; 17 | height: 0; 18 | 19 | &:checked + .lever { 20 | background-color: $switch-checked-lever-bg; 21 | 22 | &:before, &:after { 23 | left: 18px; 24 | } 25 | 26 | &:after { 27 | background-color: $switch-bg-color; 28 | } 29 | } 30 | } 31 | 32 | .switch label .lever { 33 | content: ""; 34 | display: inline-block; 35 | position: relative; 36 | width: 36px; 37 | height: 14px; 38 | background-color: $switch-unchecked-lever-bg; 39 | border-radius: $switch-radius; 40 | margin-right: 10px; 41 | transition: background 0.3s ease; 42 | vertical-align: middle; 43 | margin: 0 16px; 44 | 45 | &:before, &:after { 46 | content: ""; 47 | position: absolute; 48 | display: inline-block; 49 | width: 20px; 50 | height: 20px; 51 | border-radius: 50%; 52 | left: 0; 53 | top: -3px; 54 | transition: left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease; 55 | } 56 | 57 | &:before { 58 | background-color: transparentize($switch-bg-color, .85); 59 | } 60 | 61 | &:after { 62 | background-color: $switch-unchecked-bg; 63 | box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); 64 | } 65 | } 66 | 67 | // Switch active style 68 | input[type=checkbox]:checked:not(:disabled) ~ .lever:active::before, 69 | input[type=checkbox]:checked:not(:disabled).tabbed:focus ~ .lever::before { 70 | transform: scale(2.4); 71 | background-color: transparentize($switch-bg-color, .85); 72 | } 73 | 74 | input[type=checkbox]:not(:disabled) ~ .lever:active:before, 75 | input[type=checkbox]:not(:disabled).tabbed:focus ~ .lever::before { 76 | transform: scale(2.4); 77 | background-color: rgba(0,0,0,.08); 78 | } 79 | 80 | // Disabled Styles 81 | .switch input[type=checkbox][disabled] + .lever { 82 | cursor: default; 83 | background-color: rgba(0,0,0,.12); 84 | } 85 | 86 | .switch label input[type=checkbox][disabled] + .lever:after, 87 | .switch label input[type=checkbox][disabled]:checked + .lever:after { 88 | background-color: $input-disabled-solid-color; 89 | } 90 | -------------------------------------------------------------------------------- /resources/assets/sass/components/materialize/materialize.scss: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | // Color 4 | @import "components/color-variables"; 5 | @import "components/color-classes"; 6 | 7 | // Variables; 8 | @import "components/variables"; 9 | 10 | // Reset 11 | @import "components/normalize"; 12 | 13 | // components 14 | @import "components/global"; 15 | @import "components/badges"; 16 | @import "components/icons-material-design"; 17 | @import "components/grid"; 18 | @import "components/navbar"; 19 | @import "components/typography"; 20 | @import "components/transitions"; 21 | @import "components/cards"; 22 | @import "components/toast"; 23 | @import "components/tabs"; 24 | @import "components/tooltip"; 25 | @import "components/buttons"; 26 | @import "components/dropdown"; 27 | @import "components/waves"; 28 | @import "components/modal"; 29 | @import "components/collapsible"; 30 | @import "components/chips"; 31 | @import "components/materialbox"; 32 | @import "components/forms/forms"; 33 | @import "components/table_of_contents"; 34 | @import "components/sidenav"; 35 | @import "components/preloader"; 36 | @import "components/slider"; 37 | @import "components/carousel"; 38 | @import "components/tapTarget"; 39 | @import "components/pulse"; 40 | @import "components/datepicker"; 41 | @import "components/timepicker"; 42 | -------------------------------------------------------------------------------- /resources/assets/sass/frontend/frontend.scss: -------------------------------------------------------------------------------- 1 | @import "../components/materialize/components/color-variables"; 2 | 3 | body{ 4 | background-color: color("blue-grey", "lighten-4"); 5 | } -------------------------------------------------------------------------------- /resources/views/back/index/index.volt: -------------------------------------------------------------------------------- 1 | {% extends 'back/layouts/template.volt' %} 2 | 3 | {% block body %} 4 |
5 |
6 |
7 | 8 | Nucléon 9 |
10 |
11 |

[Backend] Index

12 |
13 |
14 |
15 | {% endblock %} 16 | -------------------------------------------------------------------------------- /resources/views/back/layouts/template.volt: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/template.volt' %} 2 | 3 | {% block stylesheets %} 4 | {% do assets.addCss('/css/backend.css') %} 5 | {% endblock %} 6 | -------------------------------------------------------------------------------- /resources/views/errors/http404.volt: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/template.volt' %} 2 | 3 | {% block title %}Not found{% endblock %} 4 | 5 | {% block body %} 6 |
7 |
8 |

9 | 44 10 |

11 |
12 |
13 | {% endblock %} 14 | -------------------------------------------------------------------------------- /resources/views/errors/http5xx.volt: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/template.volt' %} 2 | 3 | {% block title %}Internal Server Error{% endblock %} 4 | 5 | {% block body %} 6 |
7 |
8 |

9 | 5x 10 |

11 |
12 |
13 | {% endblock %} 14 | -------------------------------------------------------------------------------- /resources/views/front/auth/login.volt: -------------------------------------------------------------------------------- 1 | {% extends 'front/layouts/template.volt' %} 2 | 3 | {% block body %} 4 |
5 |
6 |

Login

7 | {% include 'partials/flash.volt' %} 8 | {{ form('login', 'method': 'post') }} 9 | {{ csrf_field() }} 10 |
11 |
12 | mail_outline 13 | {{ email_field('email', 'class' :'validate', 'required': 'true') }} 14 | 15 |
16 |
17 |
18 |
19 | lock_outline 20 | {{ password_field('password', 'class' :'validate', 'required': 'true') }} 21 | 22 |
23 |
24 |
25 |
26 | {{ submit_button('Login', 'class' :'waves-effect waves-light btn') }} 27 |
28 |
29 | {{ end_form() }} 30 |
31 |
32 | {% endblock %} 33 | -------------------------------------------------------------------------------- /resources/views/front/auth/register.volt: -------------------------------------------------------------------------------- 1 | {% extends 'front/layouts/template.volt' %} 2 | 3 | {% block body %} 4 |
5 |
6 |

Register

7 | {% include 'partials/flash.volt' %} 8 | {{ form('register', 'method': 'post') }} 9 | {{ csrf_field() }} 10 |
11 |
12 | face 13 | {{ text_field('name', 'class' :'validate', 'required': 'true') }} 14 | 15 |
16 |
17 |
18 |
19 | mail_outline 20 | {{ email_field('email', 'class' :'validate', 'required': 'true') }} 21 | 22 |
23 |
24 |
25 |
26 | lock_outline 27 | {{ password_field('password', 'class' :'validate', 'required': 'true') }} 28 | 29 |
30 |
31 |
32 |
33 | lock 34 | {{ password_field('confirm', 'class' :'validate', 'required': 'true') }} 35 | 36 |
37 |
38 |
39 |
40 | {{ submit_button('Register', 'class' :'waves-effect waves-light btn') }} 41 |
42 |
43 | {{ end_form() }} 44 |
45 |
46 | {% endblock %} 47 | -------------------------------------------------------------------------------- /resources/views/front/index/index.volt: -------------------------------------------------------------------------------- 1 | {% extends 'front/layouts/template.volt' %} 2 | 3 | {% block body %} 4 |
5 |
6 |
7 | 8 | Nucléon 9 |
10 |
11 |

[Frontend] Index

12 |
13 | {% include 'partials/flash.volt' %} 14 |
15 |
16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /resources/views/front/layouts/template.volt: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/template.volt' %} 2 | 3 | {% block stylesheets %} 4 | {% do assets.addCss('/css/frontend.css') %} 5 | {% endblock %} 6 | -------------------------------------------------------------------------------- /resources/views/home/index.volt: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/template.volt' %} 2 | 3 | {% block body %} 4 |
5 |
6 |
7 | 8 | Nucléon 9 |
10 |
11 |

12 | [NoModule] 13 | Home 14 |

15 |
16 |
17 |
18 | {% endblock %} 19 | -------------------------------------------------------------------------------- /resources/views/layouts/template.volt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {% block title %}Welcome!{% endblock %} 6 | 7 | {# Import Fonts & Icons #} 8 | {% do assets.collection('common.css').addCss('https://fonts.googleapis.com/icon?family=Material+Icons') %} 9 | {% do assets.collection('common.css').addCss('https://fonts.googleapis.com/css?family=Raleway:100,300,400') %} 10 | {# Output common.css #} 11 | {% do assets.outputCss('common.css') %} 12 | 13 | {# Block for specific css #} 14 | {% do assets.addCss('css/app.css') %} 15 | {% block stylesheets %} 16 | {% endblock %} 17 | {# Output other css #} 18 | {% do assets.outputCss() %} 19 | 20 | {# Let browser know website is optimized for mobile #} 21 | 22 | 23 | 24 | {% block header %} 25 | {% include 'partials/header.volt' %} 26 | {% endblock %} 27 | 28 | {% block body %}{% endblock %} 29 | 30 | {% block footer %} 31 | {% include 'partials/footer.volt' %} 32 | {% endblock %} 33 | 34 | {# Import library js #} 35 | {% do assets.collection('common.js').addJs('https://code.jquery.com/jquery-3.3.1.min.js') %} 36 | {% do assets.collection('common.js').addJs('https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-beta/js/materialize.min.js') %} 37 | {# Output library js #} 38 | {% do assets.outputJs('common.js') %} 39 | 40 | {# Block for specific js #} 41 | {% block javascripts %}{% endblock %} 42 | {# Output other js #} 43 | {% do assets.outputJs() %} 44 | 45 | 46 | -------------------------------------------------------------------------------- /resources/views/partials/flash.volt: -------------------------------------------------------------------------------- 1 |
2 | {{ flash.output() }} 3 | {{ flashSession.output() }} 4 |
5 | -------------------------------------------------------------------------------- /resources/views/partials/footer.volt: -------------------------------------------------------------------------------- 1 | 9 | -------------------------------------------------------------------------------- /resources/views/partials/header.volt: -------------------------------------------------------------------------------- 1 | {% set uri = router.getRewriteUri() %} 2 | 3 | 30 | -------------------------------------------------------------------------------- /routes/cli.php: -------------------------------------------------------------------------------- 1 | getShared(\Neutrino\Constants\Services::DISPATCHER); 14 | //$dispatcher->setControllerSuffix(''); 15 | 16 | /** @var \Phalcon\Mvc\Router $router */ 17 | $router = $di->getShared(\Neutrino\Constants\Services::ROUTER); 18 | 19 | /* 20 | |-------------------------------------------------------------------------- 21 | | Base Routes 22 | |-------------------------------------------------------------------------- 23 | */ 24 | $router->setDefaultNamespace('App\Kernels\Http\Controllers'); 25 | 26 | $router->notFound([ 27 | 'controller' => 'errors', 28 | 'action' => 'http404' 29 | ]); 30 | 31 | $router->addGet('/', [ 32 | 'controller' => 'home', 33 | 'action' => 'index' 34 | ]); 35 | 36 | $router->addGet('/exception-test', [ 37 | 'controller' => 'errors', 38 | 'action' => 'throwException' 39 | ]); 40 | 41 | /* 42 | |-------------------------------------------------------------------------- 43 | | Front Routes 44 | |-------------------------------------------------------------------------- 45 | */ 46 | $frontend = new \Phalcon\Mvc\Router\Group([ 47 | 'namespace' => 'App\Kernels\Http\Modules\Frontend\Controllers', 48 | 'module' => 'Frontend' 49 | ]); 50 | $frontend->addGet('/index', [ 51 | 'controller' => 'index', 52 | 'action' => 'index', 53 | ]); 54 | 55 | /* 56 | |-------------------------------------------------------------------------- 57 | | Front - Auth 58 | |-------------------------------------------------------------------------- 59 | */ 60 | $frontend->addGet('/register', [ 61 | 'controller' => 'auth', 62 | 'action' => 'register', 63 | 'middleware' => [ 64 | \App\Kernels\Http\Middleware\RedirectIfAuthenticated::class 65 | ] 66 | ]); 67 | 68 | $frontend->addPost('/register', [ 69 | 'controller' => 'auth', 70 | 'action' => 'postRegister', 71 | 'middleware' => [ 72 | \App\Kernels\Http\Middleware\RedirectIfAuthenticated::class, 73 | \Neutrino\Http\Middleware\Csrf::class 74 | ] 75 | ]); 76 | 77 | $frontend->addGet('/login', [ 78 | 'controller' => 'auth', 79 | 'action' => 'login', 80 | 'middleware' => [ 81 | \App\Kernels\Http\Middleware\RedirectIfAuthenticated::class 82 | ] 83 | ]); 84 | 85 | $frontend->addPost('/login', [ 86 | 'controller' => 'auth', 87 | 'action' => 'postLogin', 88 | 'middleware' => [ 89 | \App\Kernels\Http\Middleware\RedirectIfAuthenticated::class, 90 | \Neutrino\Http\Middleware\Csrf::class 91 | ] 92 | ]); 93 | 94 | $frontend->addGet('/logout', [ 95 | 'controller' => 'auth', 96 | 'action' => 'logout', 97 | ]); 98 | 99 | $router->mount($frontend); 100 | 101 | /* 102 | |-------------------------------------------------------------------------- 103 | | Back Routes 104 | |-------------------------------------------------------------------------- 105 | */ 106 | $backend = new \Phalcon\Mvc\Router\Group([ 107 | 'namespace' => 'App\Kernels\Http\Modules\Backend\Controllers', 108 | 'module' => 'Backend' 109 | ]); 110 | 111 | $backend->addGet('/back/:controller/:action'); 112 | 113 | $router->mount($backend); 114 | -------------------------------------------------------------------------------- /routes/micro.php: -------------------------------------------------------------------------------- 1 | 13 | | [ 14 | | 'controller' => \App\Kernels\Micro\Controllers\IndexController::class, 15 | | ] 16 | | or 17 | | 18 | | use \App\Kernels\Micro\Controllers; 19 | // .. 20 | | [ 21 | | 'controller' => Controllers\IndexController::class, 22 | | ] 23 | | 24 | // Via the Facade 25 | use Neutrino\Support\Facades\Micro\Router; 26 | 27 | Router::addGet('test', [ 28 | 'controller' => 'MyControllerClass', 29 | 'action' => 'MyActionClass' 30 | ]); 31 | 32 | */ 33 | // Via the Dependency Injector 34 | /** @var \Neutrino\Micro\Router $router */ 35 | $router = \Phalcon\Di::getDefault()->getShared(\Neutrino\Constants\Services::MICRO_ROUTER); 36 | 37 | /* 38 | |-------------------------------------------------------------------------- 39 | | Api - Routes 40 | |-------------------------------------------------------------------------- 41 | */ 42 | $router->addGet('/api/index', [ 43 | 'controller' => \App\Kernels\Micro\Controllers\MicroController::class, 44 | 'action' => 'indexAction' 45 | ]); 46 | 47 | $router->addGet('/api/test', function () { 48 | /** @var \App\Kernels\Micro\Kernel $this */ 49 | return $this->response 50 | ->setStatusCode(200, 'OK') 51 | ->setJsonContent([ 52 | 'status' => 'found', 53 | 'code' => 200 54 | ]); 55 | }); 56 | 57 | /* 58 | |-------------------------------------------------------------------------- 59 | | Api - NotFound 60 | |-------------------------------------------------------------------------- 61 | */ 62 | $router->notFound(function () { 63 | /** @var \App\Kernels\Micro\Kernel $this */ 64 | return $this->response 65 | ->setStatusCode(404, 'Not Found') 66 | ->setJsonContent([ 67 | 'status' => 'not found', 68 | 'code' => 404 69 | ]); 70 | }); 71 | 72 | /* 73 | |-------------------------------------------------------------------------- 74 | | Api - Error 75 | |-------------------------------------------------------------------------- 76 | */ 77 | /** @var \Phalcon\Mvc\Micro $app */ 78 | $app = \Phalcon\Di::getDefault()->getShared(\Neutrino\Constants\Services::APP); 79 | 80 | $app->error(function ($exception) { 81 | /** @var \App\Kernels\Micro\Kernel $this */ 82 | if ($exception instanceof \Neutrino\Exceptions\TokenMismatchException) { 83 | return $this->response 84 | ->setStatusCode(401, 'Unauthorized') 85 | ->setJsonContent([ 86 | 'status' => 'Unauthorized', 87 | 'code' => 401, 88 | 'error' => 'Token mismatch', 89 | ]); 90 | } 91 | 92 | if (APP_DEBUG) { 93 | throw $exception; 94 | } 95 | 96 | return $this->response 97 | ->setStatusCode(500, 'Internal Server Error') 98 | ->setJsonContent([ 99 | 'status' => 'Internal Server Error', 100 | 'code' => 500, 101 | ]); 102 | }); 103 | -------------------------------------------------------------------------------- /storage/caches/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /tests/Test/RoutesTest.php: -------------------------------------------------------------------------------- 1 |