├── .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 | [](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 | 4
4
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 | 5
x
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 |