diff --git a/.gitignore b/.gitignore index 5c07aa1c..3ee90a37 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,4 @@ _vimrc_local.vim /node_modules /public/assets /package-lock.json +/yarn-error.log diff --git a/README.md b/README.md index 1a3e9a5d..aa029c90 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ The Engelsystem may be installed manually or by using the provided [docker setup * Recommended: Directory Listing should be disabled. * There must be a MySQL database set up with a user who has full rights to that database. * If necessary, create a ```config/config.php``` to override values from ```config/config.default.php```. - * To remove values from the `footer_items`, `available_themes`, `locales`, `tshirt_sizes` or `headers` lists the config file has to be renamed. + * To remove values from the `footer_items`, `themes`, `locales`, `tshirt_sizes` or `headers` lists the config file has to be renamed. * To import the database, the ```bin/migrate``` script has to be run. If you can't execute scripts, you can use the `initial-install.sql` file from the release zip. * In the browser, login with credentials ```admin``` : ```asdfasdf``` and change the password. diff --git a/config/config.default.php b/config/config.default.php index 1cea89ff..98f41785 100644 --- a/config/config.default.php +++ b/config/config.default.php @@ -109,24 +109,82 @@ return [ // Default theme, 1=style1.css 'theme' => env('THEME', 1), - // Available themes - 'available_themes' => [ - '15' => 'Engelsystem DiVOC R2R', - '14' => 'Engelsystem rC3 teal (2020)', - '13' => 'Engelsystem rC3 violet (2020)', - '12' => 'Engelsystem 36c3 (2019)', - '10' => 'Engelsystem cccamp19 green (2019)', - '9' => 'Engelsystem cccamp19 yellow (2019)', - '8' => 'Engelsystem cccamp19 blue (2019)', - '7' => 'Engelsystem 35c3 dark (2018)', - '6' => 'Engelsystem 34c3 dark (2017)', - '5' => 'Engelsystem 34c3 light (2017)', - '4' => 'Engelsystem 33c3 (2016)', - '3' => 'Engelsystem 32c3 (2015)', - '2' => 'Engelsystem cccamp15', - '11' => 'Engelsystem high contrast', - '0' => 'Engelsystem light', - '1' => 'Engelsystem dark', + 'themes' => [ + 14 => [ + 'name' => 'Engelsystem rC3 teal (2020)', + 'type' => 'dark', + 'navbar_classes' => 'navbar-dark bg-black border-dark', + ], + 13 => [ + 'name' => 'Engelsystem rC3 violet (2020)', + 'type' => 'dark', + 'navbar_classes' => 'navbar-dark bg-black border-dark', + ], + 12 => [ + 'name' => 'Engelsystem 36c3 (2019)', + 'type' => 'dark', + 'navbar_classes' => 'navbar-dark bg-black border-dark', + ], + 10 => [ + 'name' => 'Engelsystem cccamp19 green (2019)', + 'type' => 'dark', + 'navbar_classes' => 'navbar-dark bg-black border-dark', + ], + 9 => [ + 'name' => 'Engelsystem cccamp19 yellow (2019)', + 'type' => 'dark', + 'navbar_classes' => 'navbar-dark bg-black border-dark', + ], + 8 => [ + 'name' => 'Engelsystem cccamp19 blue (2019)', + 'type' => 'dark', + 'navbar_classes' => 'navbar-dark bg-black border-dark', + ], + 7 => [ + 'name' => 'Engelsystem 35c3 dark (2018)', + 'type' => 'dark', + 'navbar_classes' => 'navbar-primary bg-black border-primary', + ], + 6 => [ + 'name' => 'Engelsystem 34c3 dark (2017)', + 'type' => 'dark', + 'navbar_classes' => 'navbar-dark bg-black border-dark', + ], + 5 => [ + 'name' => 'Engelsystem 34c3 light (2017)', + 'type' => 'light', + 'navbar_classes' => 'navbar-light bg-light', + ], + 4 => [ + 'name' => 'Engelsystem 33c3 (2016)', + 'type' => 'dark', + 'navbar_classes' => 'navbar-dark bg-body border-dark', + ], + 3 => [ + 'name' => 'Engelsystem 32c3 (2015)', + 'type' => 'light', + 'navbar_classes' => 'navbar-dark bg-black border-dark', + ], + 2 => [ + 'name' => 'Engelsystem cccamp15', + 'type' => 'light', + 'navbar_classes' => 'navbar-light bg-light', + ], + 11 => [ + 'name' => 'Engelsystem high contrast', + 'type' => 'dark', + 'navbar_classes' => 'navbar-dark bg-black border-dark', + ], + 0 => [ + 'name' => 'Engelsystem light', + 'type' => 'light', + 'navbar_classes' => 'navbar-light bg-light', + ], + 1 => [ + 'name' => 'Engelsystem dark', + 'type' => 'dark', + 'navbar_classes' => 'navbar-dark bg-black border-dark', + ], ], // Redirect to this site after logging in or when pressing the top-left button @@ -254,7 +312,7 @@ return [ 'X-Content-Type-Options' => 'nosniff', 'X-Frame-Options' => 'sameorigin', 'Referrer-Policy' => 'strict-origin-when-cross-origin', - 'Content-Security-Policy' => 'default-src \'self\' \'unsafe-inline\' \'unsafe-eval\'', + 'Content-Security-Policy' => 'default-src \'self\' \'unsafe-inline\' \'unsafe-eval\'; img-src \'self\' data:;', 'X-XSS-Protection' => '1; mode=block', 'Feature-Policy' => 'autoplay \'none\'', //'Strict-Transport-Security' => 'max-age=7776000', diff --git a/includes/controller/angeltypes_controller.php b/includes/controller/angeltypes_controller.php index 3b4ed1be..0cfb48e2 100644 --- a/includes/controller/angeltypes_controller.php +++ b/includes/controller/angeltypes_controller.php @@ -286,7 +286,7 @@ function angeltypes_list_controller() button( page_link_to('angeltypes', ['action' => 'view', 'angeltype_id' => $angeltype['id']]), __('view'), - 'btn-xs' + 'btn-sm' ) ]; @@ -294,12 +294,12 @@ function angeltypes_list_controller() $actions[] = button( page_link_to('angeltypes', ['action' => 'edit', 'angeltype_id' => $angeltype['id']]), __('edit'), - 'btn-xs' + 'btn-sm' ); $actions[] = button( page_link_to('angeltypes', ['action' => 'delete', 'angeltype_id' => $angeltype['id']]), __('delete'), - 'btn-xs' + 'btn-sm' ); } @@ -310,18 +310,18 @@ function angeltypes_list_controller() ['action' => 'delete', 'user_angeltype_id' => $angeltype['user_angeltype_id']] ), __('leave'), - 'btn-xs' + 'btn-sm' ); } else { $actions[] = button( page_link_to('user_angeltypes', ['action' => 'add', 'angeltype_id' => $angeltype['id']]), __('join'), - 'btn-xs' + 'btn-sm' ); } - $angeltype['restricted'] = $angeltype['restricted'] ? glyph('book') : ''; - $angeltype['no_self_signup'] = $angeltype['no_self_signup'] ? '' : glyph('share'); + $angeltype['restricted'] = $angeltype['restricted'] ? icon('book') : ''; + $angeltype['no_self_signup'] = $angeltype['no_self_signup'] ? '' : icon('pencil-square'); $angeltype['name'] = ' 'view', 'angeltype_id' => $user_angeltype['angeltype_id']]) . '">' . $user_angeltype['name'] . ' (+' . $user_angeltype['count'] . ')' diff --git a/includes/controller/user_driver_licenses_controller.php b/includes/controller/user_driver_licenses_controller.php index e6924182..55b7696a 100644 --- a/includes/controller/user_driver_licenses_controller.php +++ b/includes/controller/user_driver_licenses_controller.php @@ -24,7 +24,7 @@ function user_driver_license_required_hint() if ($angeltype['requires_driver_license']) { return sprintf( __('You joined an angeltype which requires a driving license. Please edit your driving license information here: %s.'), - '' . __('driving license information') . '' + '' . __('driving license information') . '' ); } } diff --git a/includes/helper/legacy_helper.php b/includes/helper/legacy_helper.php new file mode 100644 index 00000000..ca70ad0e --- /dev/null +++ b/includes/helper/legacy_helper.php @@ -0,0 +1,33 @@ +getGlobals(); + return $globals['themeId']; +} + +/** + * @return array + */ +function theme(): array +{ + $theme_id = theme_id(); + return config('themes')[$theme_id]; +} + +/** + * @return string + */ +function theme_type(): string +{ + return theme()['type']; +} diff --git a/includes/includes.php b/includes/includes.php index 061619dd..b94ef70d 100644 --- a/includes/includes.php +++ b/includes/includes.php @@ -57,6 +57,7 @@ $includeFiles = [ __DIR__ . '/../includes/controller/user_worklog_controller.php', __DIR__ . '/../includes/helper/graph_helper.php', + __DIR__ . '/../includes/helper/legacy_helper.php', __DIR__ . '/../includes/helper/message_helper.php', __DIR__ . '/../includes/helper/email_helper.php', diff --git a/includes/pages/admin_active.php b/includes/pages/admin_active.php index cc224f15..cb1a600b 100644 --- a/includes/pages/admin_active.php +++ b/includes/pages/admin_active.php @@ -213,9 +213,9 @@ function admin_active() $userData['shirt_size'] = (isset($tshirt_sizes[$shirtSize]) ? $tshirt_sizes[$shirtSize] : ''); $userData['work_time'] = round($usr['shift_length'] / 60) . ' min (' . sprintf('%.2f', $usr['shift_length'] / 3600) . ' h)'; - $userData['active'] = glyph_bool($usr->state->active == 1); - $userData['force_active'] = glyph_bool($usr->state->force_active == 1); - $userData['tshirt'] = glyph_bool($usr->state->got_shirt == 1); + $userData['active'] = icon_bool($usr->state->active == 1); + $userData['force_active'] = icon_bool($usr->state->force_active == 1); + $userData['tshirt'] = icon_bool($usr->state->got_shirt == 1); $userData['shift_count'] = $usr['shift_count']; $actions = []; @@ -228,7 +228,7 @@ function admin_active() $parameters['show_all_shifts'] = 1; } $actions[] = form( - [form_submit('submit', __('set active'), 'btn-xs', false)], + [form_submit('submit', __('set active'), 'btn-sm', false)], page_link_to('admin_active', $parameters) ); } @@ -241,7 +241,7 @@ function admin_active() $parametersRemove['show_all_shifts'] = 1; } $actions[] = form( - [form_submit('submit', __('remove active'), 'btn-xs', false)], + [form_submit('submit', __('remove active'), 'btn-sm', false)], page_link_to('admin_active', $parametersRemove) ); } @@ -254,7 +254,7 @@ function admin_active() $parametersShirt['show_all_shifts'] = 1; } $actions[] = form( - [form_submit('submit', __('got t-shirt'), 'btn-xs', false)], + [form_submit('submit', __('got t-shirt'), 'btn-sm', false)], page_link_to('admin_active', $parametersShirt) ); } @@ -267,7 +267,7 @@ function admin_active() $parameters['show_all_shifts'] = 1; } $actions[] = form( - [form_submit('submit', __('remove t-shirt'), 'btn-xs', false)], + [form_submit('submit', __('remove t-shirt'), 'btn-sm', false)], page_link_to('admin_active', $parameters) ); } diff --git a/includes/pages/admin_arrive.php b/includes/pages/admin_arrive.php index a40cea86..15cee8dd 100644 --- a/includes/pages/admin_arrive.php +++ b/includes/pages/admin_arrive.php @@ -95,16 +95,21 @@ function admin_arrive() $plannedDepartureDate = $usr->personalData->planned_departure_date; $arrivalDate = $usr->state->arrival_date; $plannedArrivalDate = $usr->personalData->planned_arrival_date; - $usr['rendered_planned_departure_date'] = $plannedDepartureDate ? $plannedDepartureDate->format(__('Y-m-d')) : '-'; + $usr['rendered_planned_departure_date'] = $plannedDepartureDate + ? $plannedDepartureDate->format(__('Y-m-d')) + : '-'; $usr['rendered_planned_arrival_date'] = $plannedArrivalDate ? $plannedArrivalDate->format(__('Y-m-d')) : '-'; $usr['rendered_arrival_date'] = $arrivalDate ? $arrivalDate->format(__('Y-m-d')) : '-'; - $usr['arrived'] = glyph_bool($usr->state->arrived); + $usr['arrived'] = icon_bool($usr->state->arrived); $usr['actions'] = form([ form_hidden('action', $usr->state->arrived ? 'reset' : 'arrived'), form_hidden('user', $usr->id), form_submit( - 'submit', $usr->state->arrived ? __('reset') : __('arrived'), 'btn-xs', true, - $usr->state->arrived ? 'default' : 'primary' + 'submit', + $usr->state->arrived ? __('reset') : __('arrived'), + 'btn-sm', + true, + $usr->state->arrived ? 'secondary' : 'primary' ), ]); diff --git a/includes/pages/admin_free.php b/includes/pages/admin_free.php index 7ef1d9ed..47deb4e6 100644 --- a/includes/pages/admin_free.php +++ b/includes/pages/admin_free.php @@ -94,10 +94,10 @@ function admin_free() 'dect' => sprintf('%1$s', $usr->contact->dect), 'email' => $usr->settings->email_human ? sprintf('%1$s', $email) - : glyph('eye-close'), + : icon('eye-slash'), 'actions' => auth()->can('admin_user') - ? button(page_link_to('admin_user', ['id' => $usr->id]), __('edit'), 'btn-xs') + ? button(page_link_to('admin_user', ['id' => $usr->id]), __('edit'), 'btn-sm') : '' ]; } @@ -105,9 +105,9 @@ function admin_free() form([ div('row', [ div('col-md-12 form-inline', [ - div('inline-form-spacing', [ - form_text('search', __('Search'), $search), - form_select('angeltype', __('Angeltype'), $angel_types, $angelType), + div('row', [ + form_text('search', __('Search'), $search, null, null, null, 'col'), + form_select('angeltype', __('Angeltype'), $angel_types, $angelType, '', 'col'), form_submit('submit', __('Search')) ]), ]), diff --git a/includes/pages/admin_groups.php b/includes/pages/admin_groups.php index 0dea8145..21621690 100644 --- a/includes/pages/admin_groups.php +++ b/includes/pages/admin_groups.php @@ -42,7 +42,7 @@ function admin_groups() page_link_to('admin_groups', ['action' => 'edit', 'id' => $group['UID']]), __('edit'), - 'btn-xs' + 'btn-sm' ) ]; } diff --git a/includes/pages/admin_rooms.php b/includes/pages/admin_rooms.php index be11c5fc..b6f13ceb 100644 --- a/includes/pages/admin_rooms.php +++ b/includes/pages/admin_rooms.php @@ -22,17 +22,17 @@ function admin_rooms() foreach ($rooms_source as $room) { $rooms[] = [ 'name' => Room_name_render($room), - 'map_url' => glyph_bool($room->map_url), + 'map_url' => icon_bool($room->map_url), 'actions' => table_buttons([ button( page_link_to('admin_rooms', ['show' => 'edit', 'id' => $room->id]), __('edit'), - 'btn-xs' + 'btn-sm' ), button( page_link_to('admin_rooms', ['show' => 'delete', 'id' => $room->id]), __('delete'), - 'btn-xs' + 'btn-sm' ) ]) ]; diff --git a/includes/pages/admin_shifts.php b/includes/pages/admin_shifts.php index 0e0df1c6..cf5ed47b 100644 --- a/includes/pages/admin_shifts.php +++ b/includes/pages/admin_shifts.php @@ -291,7 +291,7 @@ function admin_shifts() foreach ($shifts as $shift) { $shifts_table_entry = [ 'timeslot' => - ' ' + icon('clock') . ' ' . date('Y-m-d H:i', $shift['start']) . ' - ' . date('H:i', $shift['end']) @@ -332,13 +332,13 @@ function admin_shifts() form_hidden('change_hours', implode(', ', $change_hours)), form_hidden('angelmode', $angelmode), form_hidden('shift_over_midnight', $shift_over_midnight ? 'true' : 'false'), - form_submit('back', glyph('menu-left') . __('back')), + form_submit('back', icon('chevron-left') . __('back')), table([ 'timeslot' => __('Time and location'), 'title' => __('Type and title'), 'needed_angels' => __('Needed angels') ], $shifts_table), - form_submit('submit', glyph('floppy-disk') . __('Save')) + form_submit('submit', icon('save') . __('Save')) ]) ]); } @@ -468,7 +468,7 @@ function admin_shifts() ]) ]) ]), - form_submit('preview', glyph('search') . __('Preview')) + form_submit('preview', icon('search') . __('Preview')) ]) ]); } diff --git a/includes/pages/admin_user.php b/includes/pages/admin_user.php index e5ba9a2b..5c690226 100644 --- a/includes/pages/admin_user.php +++ b/includes/pages/admin_user.php @@ -181,7 +181,7 @@ function admin_user() } $html .= buttons([ - button(user_delete_link($user_source->id), glyph('lock') . __('delete'), 'btn-danger') + button(user_delete_link($user_source->id), icon('trash') . __('delete'), 'btn-danger') ]); $html .= "
"; diff --git a/includes/pages/guest_login.php b/includes/pages/guest_login.php index 1e486135..25eb8f42 100644 --- a/includes/pages/guest_login.php +++ b/includes/pages/guest_login.php @@ -440,5 +440,5 @@ function guest_register() */ function entry_required() { - return ''; + return icon('exclamation-triangle', 'text-info'); } diff --git a/includes/pages/user_messages.php b/includes/pages/user_messages.php index 4b611fbc..21134733 100644 --- a/includes/pages/user_messages.php +++ b/includes/pages/user_messages.php @@ -24,7 +24,7 @@ function user_unread_messages() ->count(); if ($new_messages > 0) { - return ' ' . $new_messages . ''; + return ' ' . $new_messages . ''; } } return ''; @@ -75,7 +75,7 @@ function user_messages() $receiver_user_source = $message->receiver; $messages_table_entry = [ - 'new' => !$message->read ? '' : '', + 'new' => !$message->read ? icon('envelope') : '', 'timestamp' => $message->created_at->format(__('Y-m-d H:i')), 'from' => User_Nick_render($sender_user_source), 'to' => User_Nick_render($receiver_user_source), @@ -87,14 +87,14 @@ function user_messages() $messages_table_entry['actions'] = button( page_link_to('user_messages', ['action' => 'read', 'id' => $message->id]), __('mark as read'), - 'btn-xs' + 'btn-sm' ); } } else { $messages_table_entry['actions'] = button( page_link_to('user_messages', ['action' => 'delete', 'id' => $message->id]), __('delete message'), - 'btn-xs' + 'btn-sm' ); } $messages_table[] = $messages_table_entry; diff --git a/includes/pages/user_settings.php b/includes/pages/user_settings.php index 4469db47..32302af7 100644 --- a/includes/pages/user_settings.php +++ b/includes/pages/user_settings.php @@ -169,7 +169,13 @@ function user_settings() { $request = request(); $config = config(); - $themes = config('available_themes'); + $themesConfig = config('themes'); + + $themes = []; + + foreach ($themesConfig as $themeIndex => $themeConfig) { + $themes[$themeIndex] = $themeConfig['name']; + } $enable_tshirt_size = config('enable_tshirt_size'); $tshirt_sizes = config('tshirt_sizes'); diff --git a/includes/pages/user_shifts.php b/includes/pages/user_shifts.php index 4a539c16..9f719434 100644 --- a/includes/pages/user_shifts.php +++ b/includes/pages/user_shifts.php @@ -269,7 +269,7 @@ function view_user_shifts() button( 'javascript: checkOwnTypes(\'selection_types\', ' . json_encode($ownTypes) . ')', __('Own'), - 'hidden-print' + 'd-print-none' ), ] ), @@ -281,8 +281,9 @@ function view_user_shifts() . __('Description of the jobs.') . '', 'shifts_table' => msg() . $shiftCalendarRenderer->render(), - 'ical_text' => ical_hint(), + 'ical_text' => div('mt-3', ical_hint()), 'filter' => __('Filter'), + 'filter_toggle' => __('shifts.filter.toggle'), 'set_yesterday' => __('Yesterday'), 'set_today' => __('Today'), 'set_tomorrow' => __('Tomorrow'), @@ -292,7 +293,7 @@ function view_user_shifts() 'set_next_8h' => __('next 8h'), 'buttons' => button( public_dashboard_link(), - glyph('dashboard') . __('Public Dashboard') + icon('speedometer2') . __('Public Dashboard') ) ]) ]) @@ -318,7 +319,9 @@ function ical_hint() page_link_to('shifts_json_export', ['key' => $user->api_key]), page_link_to('user_myshifts', ['reset' => 1]) ) - . ' ' . '

' @@ -351,8 +354,8 @@ function make_select($items, $selected, $name, $title = null, $additionalButtons } $buttons = []; - $buttons[] = button('javascript: checkAll(\'selection_' . $name . '\', true)', __('All'), 'hidden-print'); - $buttons[] = button('javascript: checkAll(\'selection_' . $name . '\', false)', __('None'), 'hidden-print'); + $buttons[] = button('javascript: checkAll(\'selection_' . $name . '\', true)', __('All'), 'd-print-none'); + $buttons[] = button('javascript: checkAll(\'selection_' . $name . '\', false)', __('None'), 'd-print-none'); $buttons = array_merge($buttons, $additionalButtons); $html .= buttons($buttons); @@ -362,7 +365,7 @@ function make_select($items, $selected, $name, $title = null, $additionalButtons . '' - . (!isset($i['enabled']) || $i['enabled'] ? '' : glyph('lock')) + . (!isset($i['enabled']) || $i['enabled'] ? '' : icon('lock')) . ''; } $html .= '
' . "\n"; diff --git a/includes/sys_form.php b/includes/sys_form.php index 82dcb3bb..7b21f1c4 100644 --- a/includes/sys_form.php +++ b/includes/sys_form.php @@ -29,14 +29,12 @@ function form_spinner($name, $label, $value) return form_element($label, '
-
- - -
+ +
'; } - /** * Generiert HTML Code für eine "Seite". * Fügt dazu die übergebenen Elemente zusammen. @@ -282,10 +313,10 @@ function description($data) $elements = []; foreach ($data as $label => $description) { if (!empty($label) && !empty($description)) { - $elements[] = '
' . $label . '
' . $description . '
'; + $elements[] = '
' . $label . '
' . $description . '
'; } } - return '
' . join($elements) . '
'; + return '
' . join($elements) . '
'; } /** @@ -362,7 +393,11 @@ function render_table($columns, $rows, $data = true) */ function button($href, $label, $class = '') { - return '' . $label . ''; + if (!Str::contains(str_replace(['btn-sm', 'btn-xl'], '', $class), 'btn-')) { + $class = 'btn-secondary' . ($class ? ' ' . $class : ''); + } + + return '' . $label . ''; } /** @@ -375,20 +410,21 @@ function button($href, $label, $class = '') */ function button_js($javascript, $label, $class = '') { - return '' . $label . ''; + return '' . $label . ''; } /** - * Rendert einen Knopf mit Glyph + * Renders a button with an icon * * @param string $href - * @param string $glyph + * @param string $icon * @param string $class + * * @return string */ -function button_glyph($href, $glyph, $class = '') +function button_icon($href, $icon, $class = '') { - return button($href, glyph($glyph), $class); + return button($href, icon($icon), $class); } /** @@ -399,7 +435,7 @@ function button_glyph($href, $glyph, $class = '') */ function button_help($topic = '') { - return button(config('documentation_url') . $topic, glyph('question-sign'), 'btn-sm'); + return button(config('documentation_url') . $topic, icon('question-circle'), 'btn-sm'); } /** @@ -410,7 +446,7 @@ function button_help($topic = '') */ function buttons($buttons = []) { - return '
' . table_buttons($buttons) . '
'; + return '
' . table_buttons($buttons) . '
'; } /** diff --git a/includes/view/AngelTypes_view.php b/includes/view/AngelTypes_view.php index d43e2d19..17d14a87 100644 --- a/includes/view/AngelTypes_view.php +++ b/includes/view/AngelTypes_view.php @@ -22,7 +22,7 @@ function AngelType_name_render($angeltype, $plain = false) } return '' - . ($angeltype['restricted'] ? glyph('book') : '') . $angeltype['name'] + . ($angeltype['restricted'] ? icon('book') : '') . $angeltype['name'] . ''; } @@ -37,17 +37,17 @@ function AngelType_render_membership($user_angeltype) if (!empty($user_angeltype['user_angeltype_id'])) { if ($user_angeltype['restricted']) { if (empty($user_angeltype['confirm_user_id'])) { - return glyph('book') . __('Unconfirmed'); + return icon('book') . __('Unconfirmed'); } elseif ($user_angeltype['supporter']) { - return glyph_bool(true) . __('Supporter'); + return icon_bool(true) . __('Supporter'); } - return glyph_bool(true) . __('Member'); + return icon_bool(true) . __('Member'); } elseif ($user_angeltype['supporter']) { - return glyph_bool(true) . __('Supporter'); + return icon_bool(true) . __('Supporter'); } - return glyph_bool(true) . __('Member'); + return icon_bool(true) . __('Member'); } - return glyph_bool(false); + return icon_bool(false); } /** @@ -60,8 +60,8 @@ function AngelType_delete_view($angeltype) info(sprintf(__('Do you want to delete angeltype %s?'), $angeltype['name']), true), form([ buttons([ - button(page_link_to('angeltypes'), glyph('remove') . __('cancel')), - form_submit('delete', glyph('ok') . __('delete'), 'btn-danger', false), + button(page_link_to('angeltypes'), icon('x-lg') . __('cancel')), + form_submit('delete', icon('trash') . __('delete'), 'btn-danger', false), ]) ]), ], true); @@ -142,7 +142,7 @@ function AngelType_view_buttons($angeltype, $user_angeltype, $admin_angeltypes, if ($angeltype['requires_driver_license']) { $buttons[] = button( user_driver_license_edit_link($user), - glyph('road') . __('my driving license') + icon('wallet2') . __('my driving license') ); } @@ -205,13 +205,13 @@ function AngelType_view_members($angeltype, $members, $admin_user_angeltypes, $a $member->name = User_Nick_render($member) . User_Pronoun_render($member); $member['dect'] = $member->contact->dect; if ($angeltype['requires_driver_license']) { - $member['wants_to_drive'] = glyph_bool($member['wants_to_drive']); - $member['has_car'] = glyph_bool($member['has_car']); - $member['has_license_car'] = glyph_bool($member['has_license_car']); - $member['has_license_3_5t_transporter'] = glyph_bool($member['has_license_3_5t_transporter']); - $member['has_license_7_5t_truck'] = glyph_bool($member['has_license_7_5t_truck']); - $member['has_license_12_5t_truck'] = glyph_bool($member['has_license_12_5t_truck']); - $member['has_license_forklift'] = glyph_bool($member['has_license_forklift']); + $member['wants_to_drive'] = icon_bool($member['wants_to_drive']); + $member['has_car'] = icon_bool($member['has_car']); + $member['has_license_car'] = icon_bool($member['has_license_car']); + $member['has_license_3_5t_transporter'] = icon_bool($member['has_license_3_5t_transporter']); + $member['has_license_7_5t_truck'] = icon_bool($member['has_license_7_5t_truck']); + $member['has_license_12_5t_truck'] = icon_bool($member['has_license_12_5t_truck']); + $member['has_license_forklift'] = icon_bool($member['has_license_forklift']); } if ($angeltype['restricted'] && empty($member['confirm_user_id'])) { @@ -222,7 +222,7 @@ function AngelType_view_members($angeltype, $members, $admin_user_angeltypes, $a ['action' => 'confirm', 'user_angeltype_id' => $member['user_angeltype_id']] ), __('confirm'), - 'btn-xs' + 'btn-sm' ), button( page_link_to( @@ -230,7 +230,7 @@ function AngelType_view_members($angeltype, $members, $admin_user_angeltypes, $a ['action' => 'delete', 'user_angeltype_id' => $member['user_angeltype_id']] ), __('deny'), - 'btn-xs' + 'btn-sm' ) ]); $members_unconfirmed[] = $member; @@ -244,7 +244,7 @@ function AngelType_view_members($angeltype, $members, $admin_user_angeltypes, $a 'supporter' => 0 ]), __('Remove supporter rights'), - 'btn-xs' + 'btn-sm' ) ]); } else { @@ -260,7 +260,7 @@ function AngelType_view_members($angeltype, $members, $admin_user_angeltypes, $a 'user_angeltype_id' => $member['user_angeltype_id'], 'supporter' => 1 ]), - __('Add supporter rights'), 'btn-xs') + __('Add supporter rights'), 'btn-sm') : '', button( page_link_to('user_angeltypes', [ @@ -268,7 +268,7 @@ function AngelType_view_members($angeltype, $members, $admin_user_angeltypes, $a 'user_angeltype_id' => $member['user_angeltype_id'] ]), __('remove'), - 'btn-xs' + 'btn-sm' ) ]); } @@ -403,7 +403,7 @@ function AngelType_view_info( $info[] = '

' . __('Description') . '

'; $parsedown = new Parsedown(); if ($angeltype['description'] != '') { - $info[] = '
' . $parsedown->parse($angeltype['description']) . '
'; + $info[] = $parsedown->parse($angeltype['description']); } list($supporters, $members_confirmed, $members_unconfirmed) = AngelType_view_members( @@ -455,11 +455,11 @@ function AngelType_view_info( $info[] = buttons([ button( page_link_to('user_angeltypes', ['action' => 'confirm_all', 'angeltype_id' => $angeltype['id']]), - glyph('ok') . __('confirm all') + icon('check-lg') . __('confirm all') ), button( page_link_to('user_angeltypes', ['action' => 'delete_all', 'angeltype_id' => $angeltype['id']]), - glyph('remove') . __('deny all') + icon('trash') . __('deny all') ) ]); $info[] = table($table_headers, $members_unconfirmed); @@ -502,8 +502,8 @@ function AngelTypes_list_view($angeltypes, $admin_angeltypes) ]), table([ 'name' => __('Name'), - 'restricted' => glyph('book') . __('Requires introduction'), - 'no_self_signup' => glyph('share') . __('Self Sign Up Allowed'), + 'restricted' => icon('book') . __('Requires introduction'), + 'no_self_signup' => icon('pencil-square') . __('Self Sign Up Allowed'), 'membership' => __('Membership'), 'actions' => '' ], $angeltypes) @@ -553,7 +553,7 @@ function AngelTypes_about_view_angeltype($angeltype) ); } if ($angeltype['description'] != '') { - $html .= '
' . $parsedown->parse($angeltype['description']) . '
'; + $html .= $parsedown->parse($angeltype['description']); } $html .= '
'; @@ -581,9 +581,9 @@ function AngelTypes_about_view($angeltypes, $user_logged_in) $buttons[] = button(page_link_to('login'), __('Login')); } - $faqUrl = config('faq_url'); - if (!empty($faqUrl)) { - $buttons[] = button($faqUrl, __('FAQ'), 'btn-primary'); + $footerConfig = config('footer_items'); + if (!empty($footerConfig['FAQ'])) { + $buttons[] = button($footerConfig['FAQ'], __('FAQ'), 'btn-primary'); } $content = [ diff --git a/includes/view/PublicDashboard_view.php b/includes/view/PublicDashboard_view.php index ab30b6cd..b07c8b25 100644 --- a/includes/view/PublicDashboard_view.php +++ b/includes/view/PublicDashboard_view.php @@ -34,33 +34,35 @@ function public_dashboard_view($stats, $free_shifts) $isFiltered = request()->get('filtered'); $filter = collect(session()->get('shifts-filter'))->only(['rooms', 'types'])->toArray(); return page([ - div('public-dashboard', [ - div('first', [ - stats(__('Angels needed in the next 3 hrs'), $stats['needed-3-hours']), - stats(__('Angels needed for nightshifts'), $stats['needed-night']), - stats(__('Angels currently working'), $stats['angels-working'], 'default'), - stats(__('Hours to be worked'), $stats['hours-to-work'], 'default'), - '' - ], 'statistics'), - $needed_angels - ], 'public-dashboard'), + div('wrapper', [ + div('public-dashboard', [ + div('first row', [ + stats(__('Angels needed in the next 3 hrs'), $stats['needed-3-hours']), + stats(__('Angels needed for nightshifts'), $stats['needed-night']), + stats(__('Angels currently working'), $stats['angels-working'], 'default'), + stats(__('Hours to be worked'), $stats['hours-to-work'], 'default'), + '' + ], 'statistics'), + $needed_angels + ], 'public-dashboard'), + ]), div('first col-md-12 text-center', [buttons([ button_js( ' $(\'#navbar-collapse-1,.navbar-nav,.navbar-toggle,#footer,#fullscreen-button\').remove(); $(\'.navbar-brand\').append(\' ' . __('Public Dashboard') . '\'); ', - glyph('fullscreen') . __('Fullscreen') + icon('fullscreen') . __('Fullscreen') ), auth()->user() ? button( public_dashboard_link($isFiltered ? [] : ['filtered' => 1] + $filter), - glyph('filter') . ($isFiltered ? __('All') : __('Filtered')) + icon('filter') . ($isFiltered ? __('All') : __('Filtered')) ) : '' ])], 'fullscreen-button'), ]); @@ -74,27 +76,32 @@ function public_dashboard_view($stats, $free_shifts) */ function public_dashboard_shift_render($shift) { - $panel_body = glyph('time') . $shift['start'] . ' - ' . $shift['end']; + $panel_body = icon('clock') . $shift['start'] . ' - ' . $shift['end']; $panel_body .= ' (' . $shift['duration'] . ' h)'; - $panel_body .= '
' . glyph('tasks') . $shift['shifttype_name']; + $panel_body .= '
' . icon('list-task') . $shift['shifttype_name']; if (!empty($shift['title'])) { $panel_body .= ' (' . $shift['title'] . ')'; } - $panel_body .= '
' . glyph('map-marker') . $shift['room_name']; + $panel_body .= '
' . icon('geo-alt') . $shift['room_name']; foreach ($shift['needed_angels'] as $needed_angels) { - $panel_body .= '
' . glyph('user') + $panel_body .= '
' . icon('person') . '' . $needed_angels['need'] . ' × ' . $needed_angels['angeltype_name'] . ''; } - return div('col-md-3', [ - div('dashboard-panel panel panel-' . $shift['style'], [ - div('panel-body', [ - '', + $type = 'bg-dark'; + if (theme_type() == 'light') { + $type = 'bg-light'; + } + + return div('col-md-3 mb-3', [ + div('dashboard-card card border-' . $shift['style'] . ' ' . $type, [ + div('card-body', [ + '', $panel_body ]) ]) diff --git a/includes/view/Rooms_view.php b/includes/view/Rooms_view.php index 5bd81bc8..ee36a541 100644 --- a/includes/view/Rooms_view.php +++ b/includes/view/Rooms_view.php @@ -24,7 +24,7 @@ function Room_view(Room $room, ShiftsFilterRenderer $shiftsFilterRenderer, Shift if ($room->description) { $description = '

' . __('Description') . '

'; $parsedown = new Parsedown(); - $description .= '
' . $parsedown->parse($room->description) . '
'; + $description .= $parsedown->parse($room->description); } $tabs = []; @@ -51,7 +51,7 @@ function Room_view(Room $room, ShiftsFilterRenderer $shiftsFilterRenderer, Shift $selected_tab = count($tabs) - 1; } - return page_with_title(glyph('map-marker') . $room->name, [ + return page_with_title(icon('geo-alt') . $room->name, [ $assignNotice, $description, auth()->can('admin_rooms') ? buttons([ @@ -78,8 +78,8 @@ function Room_view(Room $room, ShiftsFilterRenderer $shiftsFilterRenderer, Shift function Room_name_render(Room $room) { if (auth()->can('view_rooms')) { - return '' . glyph('map-marker') . $room->name . ''; + return '' . icon('geo-alt') . $room->name . ''; } - return glyph('map-marker') . $room->name; + return icon('geo-alt') . $room->name; } diff --git a/includes/view/ShiftCalendarRenderer.php b/includes/view/ShiftCalendarRenderer.php index 452bffa0..3f7616d1 100644 --- a/includes/view/ShiftCalendarRenderer.php +++ b/includes/view/ShiftCalendarRenderer.php @@ -204,8 +204,13 @@ class ShiftCalendarRenderer $rendered_until += ShiftCalendarRenderer::SECONDS_PER_ROW; } + $bg = ''; + if (theme_type() === 'light') { + $bg = 'bg-light'; + } + return div('lane', [ - div('header', $lane->getHeader()), + div('header ' . $bg, $lane->getHeader()), $html ]); } @@ -244,8 +249,13 @@ class ShiftCalendarRenderer */ private function renderTimeLane() { + $bg = ''; + if (theme_type() === 'light') { + $bg = 'bg-light'; + } + $time_slot = [ - div('header', [ + div('header ' . $bg, [ __('Time') ]) ]; @@ -311,12 +321,12 @@ class ShiftCalendarRenderer */ private function renderLegend() { - return div('legend', [ - label(__('Your shift'), 'primary'), - label(__('Help needed'), 'danger'), - label(__('Other angeltype needed / collides with my shifts'), 'warning'), - label(__('Shift is full'), 'success'), - label(__('Shift running/ended or user not arrived/allowed'), 'default') + return div('legend mt-3', [ + badge(__('Your shift'), 'primary'), + badge(__('Help needed'), 'danger'), + badge(__('Other angeltype needed / collides with my shifts'), 'warning'), + badge(__('Shift is full'), 'success'), + badge(__('Shift running/ended or user not arrived/allowed'), 'secondary') ]); } } diff --git a/includes/view/ShiftCalendarShiftRenderer.php b/includes/view/ShiftCalendarShiftRenderer.php index 5f2bb328..391ebe62 100644 --- a/includes/view/ShiftCalendarShiftRenderer.php +++ b/includes/view/ShiftCalendarShiftRenderer.php @@ -5,6 +5,9 @@ namespace Engelsystem; use Engelsystem\Models\Room; use Engelsystem\Models\User\User; +use function config; +use function theme_type; + /** * Renders a single shift for the shift calendar */ @@ -23,7 +26,7 @@ class ShiftCalendarShiftRenderer { $info_text = ''; if ($shift['title'] != '') { - $info_text = glyph('info-sign') . $shift['title'] . '
'; + $info_text = icon('info-circle') . $shift['title'] . '
'; } list($shift_signup_state, $shifts_row) = $this->renderShiftNeededAngeltypes( $shift, @@ -48,10 +51,10 @@ class ShiftCalendarShiftRenderer . ($blocks * ShiftCalendarRenderer::BLOCK_HEIGHT - ShiftCalendarRenderer::MARGIN) . 'px;', div( - 'shift panel panel-' . $class, + 'shift card bg-' . $class, [ $this->renderShiftHead($shift, $class, $shift_signup_state->getFreeEntries()), - div('panel-body', [ + div('card-body ' . $this->classBg(), [ $info_text, Room_name_render($room) ]), @@ -79,7 +82,7 @@ class ShiftCalendarShiftRenderer case ShiftSignupState::NOT_ARRIVED: case ShiftSignupState::NOT_YET: case ShiftSignupState::SHIFT_ENDED: - return 'default'; + return 'light'; case ShiftSignupState::ANGELTYPE: case ShiftSignupState::COLLIDES: @@ -88,7 +91,7 @@ class ShiftCalendarShiftRenderer case ShiftSignupState::FREE: return 'danger'; default: - return ''; + return 'secondary'; } } @@ -133,17 +136,17 @@ class ShiftCalendarShiftRenderer } if (auth()->can('user_shifts_admin')) { - $html .= '
  • '; + $html .= '
  • '; $html .= button(shift_entry_create_link_admin($shift), - glyph('plus') . __('Add more angels'), - 'btn-xs' + icon('plus-lg') . __('Add more angels'), + 'btn-sm' ); $html .= '
  • '; } if ($html != '') { return [ $shift_signup_state, - '' + '' ]; } @@ -167,8 +170,8 @@ class ShiftCalendarShiftRenderer { $entry_list = []; foreach ($shift_entries as $entry) { - $style = $entry['freeloaded'] ? ' text-decoration: line-through;' : ''; - $entry_list[] = '' . User_Nick_render($entry) . ''; + $class = $entry['freeloaded'] ? 'text-decoration-line-through' : ''; + $entry_list[] = '' . User_Nick_render($entry) . ''; } $shift_signup_state = Shift_signup_allowed( $user, @@ -186,14 +189,14 @@ class ShiftCalendarShiftRenderer case ShiftSignupState::ADMIN: case ShiftSignupState::FREE: // When admin or free display a link + button for sign up - $entry_list[] = '' . $inner_text . ' ' . button( shift_entry_create_link($shift, $angeltype), - __('Sign up'), 'btn-xs btn-primary hidden-print' + __('Sign up'), 'btn-sm btn-primary text-nowrap d-print-none' ); break; @@ -214,7 +217,7 @@ class ShiftCalendarShiftRenderer case ShiftSignupState::ANGELTYPE: if ($angeltype['restricted'] == 1) { // User has to be confirmed on the angeltype first - $entry_list[] = $inner_text . glyph('book'); + $entry_list[] = $inner_text . icon('book'); } else { // Add link to join the angeltype first $entry_list[] = $inner_text . '
    ' @@ -224,7 +227,7 @@ class ShiftCalendarShiftRenderer ['action' => 'add', 'angeltype_id' => $angeltype['id']] ), sprintf(__('Become %s'), $angeltype['name']), - 'btn-xs' + 'btn-sm' ); } break; @@ -240,8 +243,8 @@ class ShiftCalendarShiftRenderer break; } - $shifts_row = '
  • '; - $shifts_row .= '' . AngelType_name_render($angeltype) . ': '; + $shifts_row = '
  • '; + $shifts_row .= '' . AngelType_name_render($angeltype) . ': '; $shifts_row .= join(', ', $entry_list); $shifts_row .= '
  • '; return [ @@ -250,6 +253,20 @@ class ShiftCalendarShiftRenderer ]; } + /** + * Return the corresponding bg class + * + * @return string + */ + private function classBg(): string + { + if (theme_type() === 'light') { + return 'bg-white'; + } + + return 'bg-dark'; + } + /** * Renders the shift header * @@ -261,16 +278,16 @@ class ShiftCalendarShiftRenderer { $header_buttons = ''; if (auth()->can('admin_shifts')) { - $header_buttons = '
    ' . table_buttons([ + $header_buttons = '
    ' . table_buttons([ button( page_link_to('user_shifts', ['edit_shift' => $shift['SID']]), - glyph('edit'), - "btn-$class btn-xs" + icon('pencil'), + "btn-$class btn-sm border-light" ), button( page_link_to('user_shifts', ['delete_shift' => $shift['SID']]), - glyph('trash'), - "btn-$class btn-xs" + icon('trash'), + "btn-$class btn-sm border-light" ) ]) . '
    '; } @@ -278,12 +295,12 @@ class ShiftCalendarShiftRenderer . date('H:i', $shift['end']) . ' — ' . $shift['name']; - if($needed_angeltypes_count > 0) { - $shift_heading = '' . $needed_angeltypes_count . ' ' . $shift_heading; + if ($needed_angeltypes_count > 0) { + $shift_heading = '' . $needed_angeltypes_count . ' ' . $shift_heading; } - return div('panel-heading', [ - '' . $shift_heading . '', + return div('card-header d-flex align-items-center', [ + '' . $shift_heading . '', $header_buttons ]); } diff --git a/includes/view/ShiftEntry_view.php b/includes/view/ShiftEntry_view.php index eed89ded..b19b12a4 100644 --- a/includes/view/ShiftEntry_view.php +++ b/includes/view/ShiftEntry_view.php @@ -25,8 +25,8 @@ function ShiftEntry_delete_view_admin($shift, $angeltype, $signoff_user) ), true), form([ buttons([ - button(user_link($signoff_user->id), glyph('remove') . __('cancel')), - form_submit('delete', glyph('ok') . __('delete'), 'btn-danger', false) + button(user_link($signoff_user->id), icon('x-lg') . __('cancel')), + form_submit('delete', icon('trash') . __('delete'), 'btn-danger', false) ]), ]), ]); @@ -54,8 +54,8 @@ function ShiftEntry_delete_view($shift, $angeltype, $signoff_user_id) form([ buttons([ - button(user_link($signoff_user_id), glyph('remove') . __('cancel')), - form_submit('delete', glyph('ok') . __('delete'), 'btn-danger', false), + button(user_link($signoff_user_id), icon('x-lg') . __('cancel')), + form_submit('delete', icon('trash') . __('delete'), 'btn-danger', false), ]), ]), ]); @@ -91,7 +91,7 @@ function ShiftEntry_create_view_admin($shift, Room $room, $angeltype, $angeltype form([ form_select('angeltype_id', __('Angeltype'), $angeltypes_select, $angeltype['id']), form_select('user_id', __('User'), $users_select, $signup_user->id), - form_submit('submit', glyph('ok') . __('Save')) + form_submit('submit', icon('check-lg') . __('Save')) ]) ]); } @@ -116,7 +116,7 @@ function ShiftEntry_create_view_supporter($shift, Room $room, $angeltype, $signu AngelType_name_render($angeltype)), true), form([ form_select('user_id', __('User'), $users_select, $signup_user->id), - form_submit('submit', glyph('ok') . __('Save')) + form_submit('submit', icon('check-lg') . __('Save')) ]) ]); } @@ -139,7 +139,7 @@ function ShiftEntry_create_view_user($shift, Room $room, $angeltype, $comment) info(sprintf(__('Do you want to sign up for this shift as %s?'), AngelType_name_render($angeltype)), true), form([ form_textarea('comment', __('Comment (for your eyes only):'), $comment), - form_submit('submit', glyph('ok') . __('Save')) + form_submit('submit', icon('check-lg') . __('Save')) ]) ]); } diff --git a/includes/view/ShiftTypes_view.php b/includes/view/ShiftTypes_view.php index 3e10be29..5a4b1322 100644 --- a/includes/view/ShiftTypes_view.php +++ b/includes/view/ShiftTypes_view.php @@ -22,10 +22,10 @@ function ShiftType_delete_view($shifttype) info(sprintf(__('Do you want to delete shifttype %s?'), $shifttype['name']), true), form([ buttons([ - button(page_link_to('shifttypes'), glyph('remove') . __('cancel')), + button(page_link_to('shifttypes'), icon('x-lg') . __('cancel')), form_submit( 'delete', - glyph('ok') . __('delete'), + icon('trash') . __('delete'), 'btn-danger', false ), @@ -121,12 +121,12 @@ function ShiftTypes_list_view($shifttypes) ['action' => 'edit', 'shifttype_id' => $shifttype['id']] ), __('edit'), - 'btn-xs' + 'btn-sm' ), button( page_link_to('shifttypes', ['action' => 'delete', 'shifttype_id' => $shifttype['id']]), __('delete'), - 'btn-xs' + 'btn-sm' ) ]); } diff --git a/includes/view/ShiftsFilterRenderer.php b/includes/view/ShiftsFilterRenderer.php index b18a8ae0..1eb43501 100644 --- a/includes/view/ShiftsFilterRenderer.php +++ b/includes/view/ShiftsFilterRenderer.php @@ -58,13 +58,13 @@ class ShiftsFilterRenderer if ($dashboardFilter) { $toolbar[] = sprintf( - '
  • %s
  • ', + '
  • %s
  • ', url('/public-dashboard', ['filtered' => true] + $dashboardFilter), - glyph('dashboard') . __('Dashboard') + icon('speedometer2') . __('Dashboard') ); } } - return div('form-group', [ + return div('mb-3', [ toolbar_pills($toolbar) ]); } diff --git a/includes/view/Shifts_view.php b/includes/view/Shifts_view.php index a21a74a0..5a038ed0 100644 --- a/includes/view/Shifts_view.php +++ b/includes/view/Shifts_view.php @@ -26,17 +26,17 @@ function Shift_view_header($shift, Room $room) div('col-sm-3 col-xs-6', [ '

    ' . __('Start') . '

    ', '

    ', - glyph('calendar') . date(__('Y-m-d'), $shift['start']), + icon('calendar3') . date(__('Y-m-d'), $shift['start']), '
    ', - glyph('time') . date('H:i', $shift['start']), + icon('clock') . date('H:i', $shift['start']), '

    ' ]), div('col-sm-3 col-xs-6', [ '

    ' . __('End') . '

    ', '

    ', - glyph('calendar') . date(__('Y-m-d'), $shift['end']), + icon('calendar3') . date(__('Y-m-d'), $shift['end']), '
    ', - glyph('time') . date('H:i', $shift['end']), + icon('clock') . date('H:i', $shift['end']), '

    ' ]), div('col-sm-3 col-xs-6', [ @@ -55,14 +55,14 @@ function Shift_editor_info_render($shift) $info = []; if (!empty($shift['created_by_user_id'])) { $info[] = sprintf( - glyph('plus') . __('created at %s by %s'), + icon('plus-lg') . __('created at %s by %s'), date('Y-m-d H:i', $shift['created_at_timestamp']), User_Nick_render(User::find($shift['created_by_user_id'])) ); } if (!empty($shift['edited_by_user_id'])) { $info[] = sprintf( - glyph('pencil') . __('edited at %s by %s'), + icon('pencil') . __('edited at %s by %s'), date('Y-m-d H:i', $shift['edited_at_timestamp']), User_Nick_render(User::find($shift['edited_by_user_id'])) ); @@ -159,10 +159,10 @@ function Shift_view($shift, $shifttype, Room $room, $angeltypes_source, ShiftSig $buttons = []; if ($shift_admin || $admin_shifttypes || $admin_rooms) { $buttons = [ - $shift_admin ? button(shift_edit_link($shift), glyph('pencil') . __('edit')) : '', - $shift_admin ? button(shift_delete_link($shift), glyph('trash') . __('delete')) : '', + $shift_admin ? button(shift_edit_link($shift), icon('pencil') . __('edit')) : '', + $shift_admin ? button(shift_delete_link($shift), icon('trash') . __('delete')) : '', $admin_shifttypes ? button(shifttype_link($shifttype), $shifttype['name']) : '', - $admin_rooms ? button(room_link($room), glyph('map-marker') . $room->name) : '', + $admin_rooms ? button(room_link($room), icon('geo-alt') . $room->name) : '', ]; } $buttons[] = button(user_link(auth()->user()->id), ' ' . __('My shifts')); @@ -213,7 +213,7 @@ function Shift_view_render_needed_angeltype($needed_angeltype, $angeltypes, $shi } $needed_angels .= '
    '; - $needed_angels .= '
    ' . Shift_signup_button_render($shift, $angeltype) . '
    '; + $needed_angels .= '
    ' . Shift_signup_button_render($shift, $angeltype) . '
    '; $needed_angels .= '

    ' . AngelType_name_render($angeltype) . '

    '; $bar_max = max($needed_angeltype['count'] * 10, $needed_angeltype['taken'] * 10, 10); @@ -253,15 +253,15 @@ function Shift_view_render_shift_entry($shift_entry, $user_shift_admin, $angelty } $isUser = $shift_entry['UID'] == auth()->user()->id; if ($user_shift_admin || $angeltype_supporter || $isUser) { - $entry .= '
    '; + $entry .= '
    '; if ($user_shift_admin || $isUser) { - $entry .= button_glyph( + $entry .= button_icon( page_link_to('user_myshifts', ['edit' => $shift_entry['id'], 'id' => $shift_entry['UID']]), 'pencil', - 'btn-xs' + 'btn-sm' ); } - $entry .= button_glyph(shift_entry_delete_link($shift_entry), 'trash', 'btn-xs'); + $entry .= button_icon(shift_entry_delete_link($shift_entry), 'trash', 'btn-sm'); $entry .= '
    '; } return $entry; diff --git a/includes/view/UserAngelTypes_view.php b/includes/view/UserAngelTypes_view.php index 8cba2060..fef46876 100644 --- a/includes/view/UserAngelTypes_view.php +++ b/includes/view/UserAngelTypes_view.php @@ -24,9 +24,9 @@ function UserAngelType_update_view($user_angeltype, $user, $angeltype, $supporte buttons([ button( page_link_to('angeltypes', ['action' => 'view', 'angeltype_id' => $angeltype['id']]), - glyph('remove') . __('cancel') + icon('x-lg') . __('cancel') ), - form_submit('submit', glyph('ok') . __('yes'), 'btn-primary', false), + form_submit('submit', icon('check-lg') . __('yes'), 'btn-primary', false), ]), ], page_link_to('user_angeltypes', [ 'action' => 'update', @@ -52,9 +52,9 @@ function UserAngelTypes_delete_all_view($angeltype) 'angeltypes', ['action' => 'view', 'angeltype_id' => $angeltype['id']] ), - glyph('remove') . __('cancel') + icon('x-lg') . __('cancel') ), - form_submit('deny_all', glyph('ok') . __('yes'), 'btn-primary', false) + form_submit('deny_all', icon('check-lg') . __('yes'), 'btn-primary', false) ]), ], page_link_to('user_angeltypes', ['action' => 'delete_all', 'angeltype_id' => $angeltype['id']])), ]); @@ -71,8 +71,8 @@ function UserAngelTypes_confirm_all_view($angeltype) info(sprintf(__('Do you really want to confirm all users for %s?'), $angeltype['name']), true), form([ buttons([ - button(angeltype_link($angeltype['id']), glyph('remove') . __('cancel')), - form_submit('confirm_all', glyph('ok') . __('yes'), 'btn-primary', false), + button(angeltype_link($angeltype['id']), icon('x-lg') . __('cancel')), + form_submit('confirm_all', icon('check-lg') . __('yes'), 'btn-primary', false), ]), ], page_link_to('user_angeltypes', ['action' => 'confirm_all', 'angeltype_id' => $angeltype['id']])), ]); @@ -95,8 +95,8 @@ function UserAngelType_confirm_view($user_angeltype, $user, $angeltype) ), true), form([ buttons([ - button(angeltype_link($angeltype['id']), glyph('remove') . __('cancel')), - form_submit('confirm_user', glyph('ok') . __('yes'), 'btn-primary', false), + button(angeltype_link($angeltype['id']), icon('x-lg') . __('cancel')), + form_submit('confirm_user', icon('check-lg') . __('yes'), 'btn-primary', false), ]), ], page_link_to('user_angeltypes', ['action' => 'confirm', 'user_angeltype_id' => $user_angeltype['id']])), ]); @@ -119,8 +119,8 @@ function UserAngelType_delete_view($user_angeltype, $user, $angeltype) ), true), form([ buttons([ - button(angeltype_link($angeltype['id']), glyph('remove') . __('cancel')), - form_submit('delete', glyph('ok') . __('yes'), 'btn-primary', false), + button(angeltype_link($angeltype['id']), icon('x-lg') . __('cancel')), + form_submit('delete', icon('check-lg') . __('yes'), 'btn-primary', false), ]), ], page_link_to('user_angeltypes', ['action' => 'delete', 'user_angeltype_id' => $user_angeltype['id']])), ], true); @@ -172,8 +172,8 @@ function UserAngelType_join_view($user, $angeltype) ), true), form([ buttons([ - button(angeltype_link($angeltype['id']), glyph('remove') . __('cancel')), - form_submit('submit', glyph('ok') . __('save'), 'btn-primary', false) + button(angeltype_link($angeltype['id']), icon('x-lg') . __('cancel')), + form_submit('submit', icon('check-lg') . __('save'), 'btn-primary', false) ]), ], page_link_to( 'user_angeltypes', diff --git a/includes/view/UserDriverLicenses_view.php b/includes/view/UserDriverLicenses_view.php index 36ad575a..d43b6b03 100644 --- a/includes/view/UserDriverLicenses_view.php +++ b/includes/view/UserDriverLicenses_view.php @@ -20,8 +20,7 @@ function UserDriverLicense_edit_view($user_source, $wants_to_drive, $user_driver form([ form_info(__('Privacy'), __('Your driving license information is only visible for supporters and admins.')), form_checkbox('wants_to_drive', __('I am willing to drive a car for the event'), $wants_to_drive), - div('panel panel-default', [ - div('panel-body', [ + div('m-3', [ form_checkbox( 'has_car', __('I have my own car with me and am willing to use it for the event (You\'ll get reimbursed for fuel)'), @@ -49,7 +48,6 @@ function UserDriverLicense_edit_view($user_source, $wants_to_drive, $user_driver __('Forklift'), $user_driver_license['has_license_forklift'] ) - ]) ], 'driving_license'), form_submit('submit', __('Save')) ]), diff --git a/includes/view/UserHintsRenderer.php b/includes/view/UserHintsRenderer.php index 8d749ee9..c9496652 100644 --- a/includes/view/UserHintsRenderer.php +++ b/includes/view/UserHintsRenderer.php @@ -18,10 +18,10 @@ class UserHintsRenderer { if (count($this->hints) > 0) { $hint_class = $this->important ? 'danger' : 'info'; - $glyphicon = $this->important ? 'warning-sign' : 'info-sign'; + $icon = $this->important ? 'exclamation-triangle' : 'info-circle'; return toolbar_popover( - $glyphicon . ' text-' . $hint_class, '', $this->hints, 'bg-' . $hint_class + $icon . ' text-white', '', $this->hints, 'bg-' . $hint_class ); } diff --git a/includes/view/UserWorkLog_view.php b/includes/view/UserWorkLog_view.php index 8185bad9..3ad51877 100644 --- a/includes/view/UserWorkLog_view.php +++ b/includes/view/UserWorkLog_view.php @@ -18,8 +18,8 @@ function UserWorkLog_delete_view(User $user) ), true), form([ buttons([ - button(user_link($user->id), glyph('remove') . __('cancel')), - form_submit('submit', glyph('ok') . __('delete'), 'btn-danger', false), + button(user_link($user->id), icon('x-lg') . __('cancel')), + form_submit('submit', icon('check-lg') . __('delete'), 'btn-danger', false), ]), ]), ]); diff --git a/includes/view/User_view.php b/includes/view/User_view.php index c8cef972..74e0aa17 100644 --- a/includes/view/User_view.php +++ b/includes/view/User_view.php @@ -140,7 +140,7 @@ function User_delete_view($user) return page_with_title(sprintf(__('Delete %s'), User_Nick_render($user)), [ msg(), buttons([ - button(user_edit_link($user->id), glyph('chevron-left') . __('back')) + button(user_edit_link($user->id), icon('chevron-left') . __('back')) ]), error( __('Do you really want to delete the user including all his shifts and every other piece of his data?'), @@ -164,7 +164,7 @@ function User_edit_vouchers_view($user) return page_with_title(sprintf(__('%s\'s vouchers'), User_Nick_render($user)), [ msg(), buttons([ - button(user_link($user->id), glyph('chevron-left') . __('back')) + button(user_link($user->id), icon('chevron-left') . __('back')) ]), info(sprintf( __('Angel should receive at least %d vouchers.'), @@ -208,12 +208,12 @@ function Users_view( $u['first_name'] = $user->personalData->first_name; $u['last_name'] = $user->personalData->last_name; $u['dect'] = sprintf('%1$s', $user->contact->dect); - $u['arrived'] = glyph_bool($user->state->arrived); + $u['arrived'] = icon_bool($user->state->arrived); $u['got_voucher'] = $user->state->got_voucher; $u['freeloads'] = $user->getAttribute('freeloads'); - $u['active'] = glyph_bool($user->state->active); - $u['force_active'] = glyph_bool($user->state->force_active); - $u['got_shirt'] = glyph_bool($user->state->got_shirt); + $u['active'] = icon_bool($user->state->active); + $u['force_active'] = icon_bool($user->state->force_active); + $u['got_shirt'] = icon_bool($user->state->got_shirt); $u['shirt_size'] = $user->personalData->shirt_size; $u['arrival_date'] = $user->personalData->planned_arrival_date ? $user->personalData->planned_arrival_date->format(__('Y-m-d')) : ''; @@ -221,7 +221,7 @@ function Users_view( ? $user->personalData->planned_departure_date->format(__('Y-m-d')) : ''; $u['last_login_at'] = $user->last_login_at ? $user->last_login_at->format(__('m/d/Y h:i a')) : ''; $u['actions'] = table_buttons([ - button_glyph(page_link_to('admin_user', ['id' => $user->id]), 'edit', 'btn-xs') + button_icon(page_link_to('admin_user', ['id' => $user->id]), 'pencil-square', 'btn-sm') ]); $usersList[] = $u; } @@ -269,7 +269,7 @@ function Users_view( return page_with_title(__('All users'), [ msg(), buttons([ - button(page_link_to('register'), glyph('plus') . __('New user')) + button(page_link_to('register'), icon('plus-lg') . __('New user')) ]), table($user_table_headers, $usersList) ]); @@ -390,9 +390,9 @@ function User_view_myshift($shift, $user_source, $its_me) } $myshift = [ - 'date' => glyph('calendar') + 'date' => icon('calendar3') . date('Y-m-d', $shift['start']) . '
    ' - . glyph('time') . date('H:i', $shift['start']) + . icon('clock') . date('H:i', $shift['start']) . ' - ' . date('H:i', $shift['end']), 'duration' => sprintf('%.2f', ($shift['end'] - $shift['start']) / 3600) . ' h', @@ -418,20 +418,20 @@ function User_view_myshift($shift, $user_source, $its_me) } $myshift['actions'] = [ - button(shift_link($shift), glyph('eye-open') . __('view'), 'btn-xs') + button(shift_link($shift), icon('eye') . __('view'), 'btn-sm') ]; if ($its_me || auth()->can('user_shifts_admin')) { $myshift['actions'][] = button( page_link_to('user_myshifts', ['edit' => $shift['id'], 'id' => $user_source->id]), - glyph('edit') . __('edit'), - 'btn-xs' + icon('pencil-square') . __('edit'), + 'btn-sm' ); } if (Shift_signout_allowed($shift, ['id' => $shift['TID']], $user_source->id)) { $myshift['actions'][] = button( shift_entry_delete_link($shift), - glyph('trash') . __('sign off'), - 'btn-xs' + icon('trash') . __('sign off'), + 'btn-sm' ); } $myshift['actions'] = table_buttons($myshift['actions']); @@ -518,19 +518,19 @@ function User_view_worklog(Worklog $worklog, $admin_user_worklog_privilege) $actions = table_buttons([ button( user_worklog_edit_link($worklog), - glyph('edit') . __('edit'), - 'btn-xs' + icon('pencil-square') . __('edit'), + 'btn-sm' ), button( user_worklog_delete_link($worklog), - glyph('trash') . __('delete'), - 'btn-xs' + icon('trash') . __('delete'), + 'btn-sm' ) ]); } return [ - 'date' => glyph('calendar') . date('Y-m-d', $worklog->worked_at->timestamp), + 'date' => icon('calendar3') . date('Y-m-d', $worklog->worked_at->timestamp), 'duration' => sprintf('%.2f', $worklog->hours) . ' h', 'room' => '', 'shift_info' => __('Work log entry'), @@ -615,45 +615,45 @@ function User_view( . (config('enable_user_name') ? ' ' . $user_name . '' : ''), [ msg(), - div('row space-top', [ + div('row m-3', [ div('col-md-12', [ buttons([ $admin_user_privilege ? button( page_link_to('admin_user', ['id' => $user_source->id]), - glyph('edit') . __('edit') + icon('pencil-square') . __('edit') ) : '', $admin_user_privilege ? button( user_driver_license_edit_link($user_source), - glyph('road') . __('driving license') + icon('wallet2') . __('driving license') ) : '', (($admin_user_privilege || $auth->can('admin_arrive')) && !$user_source->state->arrived) ? form([ form_hidden('action', 'arrived'), form_hidden('user', $user_source->id), - form_submit('submit', __('arrived'), '', false, 'default') + form_submit('submit', __('arrived'), '', false, 'primary') ], page_link_to('admin_arrive'), true) : '', $admin_user_privilege ? button( page_link_to( 'users', ['action' => 'edit_vouchers', 'user_id' => $user_source->id] ), - glyph('cutlery') . __('Edit vouchers') + icon('file-binary-fill') . __('Edit vouchers') ) : '', $admin_user_worklog_privilege ? button( user_worklog_add_link($user_source), - glyph('list') . __('Add work log') + icon('list') . __('Add work log') ) : '', $its_me ? button( page_link_to('user_settings'), - glyph('list-alt') . __('Settings') + icon('gear') . __('Settings') ) : '', ($its_me && $auth->can('ical')) ? button( page_link_to('ical', ['key' => $user_source->api_key]), - glyph('calendar') . __('iCal Export') + icon('calendar3') . __('iCal Export') ) : '', ($its_me && $auth->can('shifts_json_export')) ? button( page_link_to('shifts_json_export', ['key' => $user_source->api_key]), - glyph('export') . __('JSON Export') + icon('box-arrow-up-right') . __('JSON Export') ) : '', ($its_me && ( $auth->can('shifts_json_export') @@ -661,14 +661,14 @@ function User_view( || $auth->can('atom') )) ? button( page_link_to('user_myshifts', ['reset' => 1]), - glyph('repeat') . __('Reset API key') + icon('arrow-repeat') . __('Reset API key') ) : '' ]) ]) ]), div('row', [ div('col-md-2', [ - heading(glyph('phone') + heading(icon('phone') . '' . $user_source->contact->dect, 1) . '' @@ -681,7 +681,7 @@ function User_view( ($its_me || $admin_user_privilege) ? '

    ' . __('Shifts') . '

    ' : '', $myshifts_table, ($its_me && $nightShiftsConfig['enabled']) ? info( - glyph('info-sign') . sprintf( + icon('info-circle') . sprintf( __('Your night shifts between %d and %d am count twice.'), $nightShiftsConfig['start'], $nightShiftsConfig['end'] @@ -734,7 +734,7 @@ function User_view_state_user($user_source) ]; if ($user_source->state->arrived) { - $state[] = '' . glyph('home') . __('Arrived') . ''; + $state[] = '' . icon('house') . __('Arrived') . ''; } else { $state[] = '' . __('Not arrived') . ''; } @@ -755,13 +755,13 @@ function User_view_state_admin($freeloader, $user_source) $state = []; if ($freeloader) { - $state[] = '' . glyph('exclamation-sign') . __('Freeloader') . ''; + $state[] = '' . icon('exclamation-circle') . __('Freeloader') . ''; } $state[] = User_shift_state_render($user_source); if ($user_source->state->arrived) { - $state[] = '' . glyph('home') + $state[] = '' . icon('house') . sprintf( __('Arrived at %s'), $user_source->state->arrival_date ? $user_source->state->arrival_date->format('Y-m-d') : '' @@ -791,7 +791,7 @@ function User_view_state_admin($freeloader, $user_source) $availableCount = max($voucherCount, $availableCount); if ($user_source->state->got_voucher > 0) { $state[] = '' - . glyph('cutlery') + . icon('file-binary-fill') . __('Got %s of %s vouchers', [$voucherCount, $availableCount]) . ''; } else { @@ -817,7 +817,7 @@ function User_angeltypes_render($user_angeltypes) $class = 'text-warning'; } $output[] = '' - . ($angeltype['supporter'] ? glyph('education') : '') . $angeltype['name'] + . ($angeltype['supporter'] ? icon('patch-check') : '') . $angeltype['name'] . ''; } return div('col-md-2', [ @@ -934,7 +934,7 @@ function render_user_departure_date_hint() { if (config('enable_planned_arrival') && !auth()->user()->personalData->planned_departure_date) { $text = __('Please enter your planned date of departure on your settings page to give us a feeling for teardown capacities.'); - return render_profile_link($text, null, 'alert-link'); + return render_profile_link($text, null, 'text-danger'); } return null; @@ -980,7 +980,7 @@ function render_user_tshirt_hint() { if (config('enable_tshirt_size') && !auth()->user()->personalData->shirt_size) { $text = __('You need to specify a tshirt size in your settings!'); - return render_profile_link($text, null, 'alert-link'); + return render_profile_link($text, null, 'text-danger'); } return null; @@ -994,7 +994,7 @@ function render_user_dect_hint() $user = auth()->user(); if ($user->state->arrived && config('enable_dect') && !$user->contact->dect) { $text = __('You need to specify a DECT phone number in your settings! If you don\'t have a DECT phone, just enter \'-\'.'); - return render_profile_link($text, null, 'alert-link'); + return render_profile_link($text, null, 'text-danger'); } return null; diff --git a/package.json b/package.json index 08d9b0f8..7f78e334 100644 --- a/package.json +++ b/package.json @@ -6,44 +6,42 @@ "author": "https://github.com/engelsystem/engelsystem/contributors", "license": "GPL-2.0-or-later", "scripts": { - "build": "NODE_ENV=production run-s build:clean build:webpack", + "build": "(export NODE_ENV=production && yarn build:clean && yarn build:webpack)", "build:clean": "rimraf public/assets", "build:webpack": "webpack", "build:watch": "webpack --watch" }, "dependencies": { - "bootstrap": "^3", + "@popperjs/core": "^2.9.2", + "bootstrap": "^5.1.0", "chart.js": "^2.9.3", "core-js": "^3.6.5", - "eonasdan-bootstrap-datetimepicker": "^4.17.47", "jquery": "^3.5.1", "jquery-ui": "^1.11.2", "moment": "^2.27.0", + "moment-timezone": "^0.5.31", "select2": "^4.0.13", - "select2-bootstrap-theme": "0.1.0-beta.10" + "select2-bootstrap-5-theme": "^1.1.1", + "tempusdominus-bootstrap-4": "^5.39.0" }, "devDependencies": { "@babel/core": "^7.11.5", "@babel/preset-env": "^7.11.5", "autoprefixer": "^10.2.5", "babel-loader": "^8.1.0", - "css-loader": "^5.2.5", - "css-minimizer-webpack-plugin": "^3.0.0", + "bootstrap-icons": "^1.4.1", + "css-loader": "^5.2.2", + "css-minimizer-webpack-plugin": "^2.0.0", "file-loader": "^6.1.0", - "less": "^4.1.1", - "less-loader": "^9.0.0", "mini-css-extract-plugin": "^1.6.0", - "mkdirp": "^1.0.4", - "npm-run-all": "^4.1.3", - "postcss": "^8.3.0", - "postcss-loader": "^5.3.0", + "postcss": "^8.2.8", + "postcss-loader": "^5.2.0", "rimraf": "^3.0.2", + "sass": "^1.35.1", + "sass-loader": "^12.0.0", "style-loader": "^2.0.0", - "terser-webpack-plugin": "^5.1.2", - "webpack": "^5.37.1", - "webpack-cli": "^4.7.0" - }, - "resolutions": { - "moment-timezone": "^0.5" + "terser-webpack-plugin": "^5.1.1", + "webpack": "^5.33.2", + "webpack-cli": "^4.6.0" } } diff --git a/resources/assets/js/forms.js b/resources/assets/js/forms.js index 8d1758cc..204a0fe9 100644 --- a/resources/assets/js/forms.js +++ b/resources/assets/js/forms.js @@ -108,7 +108,13 @@ $(function () { maxDate: '', locale: $('html').attr('lang'), format: element.format, - widgetPositioning: {horizontal: 'auto', vertical: 'bottom'} + widgetPositioning: {horizontal: 'auto', vertical: 'bottom'}, + icons: { + time: 'bi bi-clock', + date: 'bi bi-calendar', + up: 'bi bi-arrow-up', + down: 'bi bi-arrow-down' + } }; $.extend(opts, elem.data()); if (opts.minDate.length === 0) { @@ -120,13 +126,19 @@ $(function () { elem.children('input').attr('type', 'text'); elem.children().on('click', function (ev) { ev.stopImmediatePropagation(); - if (typeof elem.data('DateTimePicker') === 'undefined') { + if (typeof elem.data('datetimepicker') === 'undefined') { elem.datetimepicker(opts); - elem.data('DateTimePicker').show(); + elem.data('datetimepicker').show(); + + // close on click anywhere outside + $(document).on('click', () => { + elem.data('datetimepicker').hide() + }) } else { - elem.data('DateTimePicker').toggle(); + elem.data('datetimepicker').toggle(); } }); + }); }); }); @@ -140,19 +152,29 @@ $(function () { var opts = { locale: $('html').attr('lang'), format: 'HH:mm', - widgetPositioning: {horizontal: 'auto', vertical: 'bottom'} + widgetPositioning: {horizontal: 'auto', vertical: 'bottom'}, + icons: { + up: 'bi bi-arrow-up', + down: 'bi bi-arrow-down' + } }; $.extend(opts, elem.data()); elem.children('input').attr('type', 'text'); elem.children('input').on('click', function (ev) { ev.stopImmediatePropagation(); - if (typeof elem.data('DateTimePicker') === 'undefined') { + if (typeof elem.data('datetimepicker') === 'undefined') { elem.datetimepicker(opts); - elem.data('DateTimePicker').show(); + elem.data('datetimepicker').show(); + + // close on click anywhere outside + $(document).on('click', () => { + elem.data('datetimepicker').hide() + }) } else { - elem.data('DateTimePicker').toggle(); + elem.data('datetimepicker').toggle(); } }); + }); }); @@ -177,24 +199,21 @@ $(function () { }); }); -/** - * Enable select2 - */ $(function () { - $.fn.select2.defaults.set('theme', 'bootstrap'); - - $('select').select2(); -}); + $('select').select2({ + theme: 'bootstrap-5', + }); +}) /** * Show oauth buttons on welcome title click */ $(function () { $('#welcome-title').on('click', function () { - $('.form-group.btn-group .btn.hidden').removeClass('hidden'); + $('.btn-group.btn-group .btn.d-none').removeClass('d-none'); }); $('#oauth-settings-title').on('click', function () { - $('table tr.hidden').removeClass('hidden'); + $('table tr.d-none').removeClass('d-none'); }); }); @@ -209,7 +228,7 @@ window.addEventListener('DOMContentLoaded', () => { return; } - filter.classList.remove('in'); + filter.classList.remove('show'); }); $(() => { if (typeof (localStorage) === 'undefined') { diff --git a/resources/assets/js/offcanvas.js b/resources/assets/js/offcanvas.js deleted file mode 100644 index 792cca7c..00000000 --- a/resources/assets/js/offcanvas.js +++ /dev/null @@ -1,13 +0,0 @@ -;(function($, window, document, undefined) { - 'use strict'; - - $(document).ready(function () { - $('[data-toggle="offcanvas"]').click(function () { - var button = $(this); - button.toggleClass('is-open') - $(button.attr('data-target')).toggleClass('in'); - }); - }); - -}(jQuery, window, window.document)); - diff --git a/resources/assets/js/vendor.js b/resources/assets/js/vendor.js index 1341a1e6..8adb4aa4 100644 --- a/resources/assets/js/vendor.js +++ b/resources/assets/js/vendor.js @@ -1,12 +1,11 @@ require('core-js/stable'); window.$ = window.jQuery = require('jquery'); require('jquery-ui'); -require('bootstrap'); +window.bootstrap = require('bootstrap'); window.moment = require('moment'); require('moment/locale/de'); -require('eonasdan-bootstrap-datetimepicker'); +require('tempusdominus-bootstrap-4/build/js/tempusdominus-bootstrap-4'); require('chart.js'); -require('./offcanvas'); require('./forms'); require('./sticky-headers'); require('./moment-countdown'); diff --git a/resources/assets/themes/base.less b/resources/assets/themes/base.scss similarity index 51% rename from resources/assets/themes/base.less rename to resources/assets/themes/base.scss index 6df72737..5ddb42ec 100644 --- a/resources/assets/themes/base.less +++ b/resources/assets/themes/base.scss @@ -1,20 +1,55 @@ -@import "../../../node_modules/bootstrap/less/bootstrap"; -@import "../../../node_modules/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css"; -@import "../../../node_modules/select2/dist/css/select2.min.css"; -@import "../../../node_modules/select2-bootstrap-theme/src/select2-bootstrap.less"; +// Basic variables +@use "sass:map"; + +// select 2 variables +$link-decoration: none !default; +$link-hover-decoration: underline !default; + +$nav-tabs-link-active-color: #fff !default; +$nav-tabs-link-active-bg: $primary !default; +$nav-tabs-link-active-border-color: none !default; + +// Imports +@import "~bootstrap/scss/functions"; +@import "~bootstrap/scss/variables"; +@import "~bootstrap/scss/mixins"; + +$custom-colors: ( + black: #000 +); + +$theme-colors: map-merge($theme-colors, $custom-colors); + +@import "~bootstrap/scss/bootstrap"; + +@import "~bootstrap-icons/font/bootstrap-icons.css"; +@import "~tempusdominus-bootstrap-4/build/css/tempusdominus-bootstrap-4"; +@import "~select2/src/scss/core"; +@import "~select2-bootstrap-5-theme/src/include-all"; @import "error"; +// temporary bg-body fix (remove once Bootstrap 5.1.1 has been released) +.bg-body { + --bs-bg-opacity: 1; + background-color: $body-bg !important; +} + +$navbar-height: 3.125rem; + body { - padding-top: 50px; + padding-top: 70px; } .footer a { - color: @text-muted; + color: $text-muted; } -.first { - clear: both; - margin-top: 30px; +.text-inherit { + color: inherit; + + &:hover { + color: inherit; + } } .text-big { @@ -25,7 +60,7 @@ body { } .icon-icon_angel { - background-color: @text-color; + background-color: $body-color; display: inline-block; width: 1em; @@ -35,29 +70,50 @@ body { mask-size: cover; } +.text-light .icon-icon_angel { + background-color: map.get($theme-colors, "light"); +} + +.dark .icon-icon_angel { + background-color: map.get($theme-colors, "dark"); +} + a .icon-icon_angel { - background-color: @link-color; + background-color: $link-color; } .navbar .icon-icon_angel { - background-color: @navbar-default-link-disabled-color; + background-color: $nav-link-disabled-color; } .navbar-brand .icon-icon_angel { - background-color: @navbar-default-brand-color; + background-color: $body-color; +} + +.nav-item--userhints { + margin: -$navbar-padding-y 0; +} + +.popover--userhints .alert:last-of-type { + margin-bottom: 0; } table a > .icon-icon_angel { - background-color: @text-color; + background-color: $body-color; } .table .form-group { margin-bottom: 0; } +.input-group.datetime, +.input-group.time { + .bootstrap-datetimepicker-widget { + inset: 42px auto auto 0 !important; + } +} + .stats { - .make-md-column(3); - .make-xs-column(6); font-size: 20px; height: 150px; text-align: center; @@ -67,7 +123,7 @@ table a > .icon-icon_angel { font-weight: 200; } - @media (max-width: @screen-md) { + @media (max-width: map-get($grid-breakpoints, 'md')) { font-size: inherit; .number { font-size: 40px; @@ -77,23 +133,23 @@ table a > .icon-icon_angel { .stats-danger { - color: @brand-danger; + color: map-get($theme-colors, 'danger'); } .stats-warning { - color: @brand-warning; + color: map-get($theme-colors, 'warning'); } .stats-success { - color: @brand-success; + color: map-get($theme-colors, 'success'); } -.dashboard-panel { +.dashboard-card { position: relative; font-size: 20px; - color: @headings-color; + color: $headings-color; - .panel-link { + .card-link { position: absolute; width: 100%; height: 100%; @@ -101,48 +157,18 @@ table a > .icon-icon_angel { left: 0; text-decoration: none; /* No underlines on the link */ z-index: 10; /* Places the link above everything else in the div */ - background-color: @brand-primary; /* Fix to make div clickable in IE */ + background-color: $primary; /* Fix to make div clickable in IE */ opacity: 0; /* Fix to make div clickable in IE */ filter: alpha(opacity=1); /* Fix to make div clickable in IE */ } - .panel-link:hover { + .card-link:hover { opacity: 0.3; } } -.panel-primary .panel-heading a { - color: @panel-primary-text; - background-color: @panel-primary-heading-bg; -} - -.panel-default .panel-heading a { - color: @panel-default-text; - background-color: @panel-default-heading-bg; -} - -.panel-info .panel-heading a { - color: @panel-info-text; - background-color: @panel-info-heading-bg; -} - -.panel-success .panel-heading a { - color: @panel-success-text; - background-color: @panel-success-heading-bg; -} - -.panel-warning .panel-heading a { - color: @panel-warning-text; - background-color: @panel-warning-heading-bg; -} - -.panel-danger .panel-heading a { - color: @panel-danger-text; - background-color: @panel-danger-heading-bg; -} - .select2-dropdown { - background-color: @input-bg; + background-color: $input-bg; } .selection .checkbox { @@ -157,39 +183,38 @@ table a > .icon-icon_angel { width: 100%; .lane { - background: @table-bg-accent; + background: $table-striped-bg; flex-grow: 1; min-width: 280px; width: 280px; flex-shrink: 1; .header { - background: @panel-bg; - border-bottom: 1px solid @table-border-color; + border-bottom: 1px solid $table-border-color; height: 30px; padding: 5px 5px 5px 16px; } .tick { height: 30px; - border-top: 1px solid darken(@table-bg-accent, 2%); + border-top: 1px solid darken($table-striped-bg, 2%); } .tick.hour { - border-top: 2px solid @table-border-color; + border-top: 2px solid $table-border-color; font-size: 0.9em; padding-left: 5px; } .tick.day { - border-top: 2px solid @brand-primary; + border-top: 2px solid $primary; font-size: 0.9em; padding-left: 5px; } } .lane.time { - border-right: 1px solid @table-border-color; + border-right: 1px solid $table-border-color; flex-grow: 0; min-width: 50px; width: 50px; @@ -213,10 +238,6 @@ table a > .icon-icon_angel { } } -.space-top { - margin-top: 15px; -} - .column_duration { text-align: right; } @@ -250,22 +271,12 @@ h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { overflow-x: inherit; } -.inline-form-spacing { - margin-bottom: @form-group-margin-bottom; -} - -.user-settings .settings-menu ul { - margin-top: @line-height-computed; -} - span.ref-id[id] { padding-top: 50px; } .faq { - .panel-heading h3 { - margin: 0; - + .card-header { small a.ref-link { display: none; } @@ -278,6 +289,27 @@ span.ref-id[id] { } } +// Cards +.card-body > *:last-child { + margin-bottom: 0; +} + +.card-header { + &.bg-dark { + color: map.get($theme-colors, "light"); + } + + &.bg-light { + color: map.get($theme-colors, "dark"); + } +} + +// code tag +code { + background-color: $input-disabled-bg; + @include border-radius($input-border-radius); +} + @keyframes pulse { 0% { transform: rotate(0deg); @@ -327,12 +359,12 @@ span.ref-id[id] { padding: 2px 6px; margin-top: 6px; margin-bottom: 4px; - max-height: @navbar-height; + max-height: $navbar-height; .icon { - border-color: @brand-primary; + border-color: $primary; font-weight: bold; - color: @brand-primary; + color: $primary; font-size: 25px; &-close { padding: 0 3px; @@ -349,59 +381,7 @@ span.ref-id[id] { } } - -@media screen and (max-width: @grid-float-breakpoint-max) { - #navbar-offcanvas { - display: block; - position: absolute; - width: 90%; - height: calc( 100vh - @navbar-height); - max-height: unset; - left: 101%; - top: @navbar-height + 1; - // extra padding because mobile Safari displays a bottom bar hiding parts of the menu - padding-bottom: 75px; - - transition: left .3s ease-in-out; - - background: @navbar-default-bg; - margin: 0 !important; // Overridden in theme with high specifity: - // .container > .navbar-header, - // .container-fluid > .navbar-header, - // .container > .navbar-collapse, - // .container-fluid > .navbar-collapse - - // Is open - &.collapse.in { - left: 10%; - display: block; - overflow-y: auto; - box-shadow: -5px 20px 20px 0 rgba(0, 0, 0, 0.5), 5px 0 5px -5px rgba(0, 0, 0, 0.5); - } - - // Hide current page in nav. - .nav > li.active { - display: none; - } - - .caret { - float: right; - margin-top: 7px; - } - } - - .navbar-toggle { - align-items: center; - font-size: 18px; - display: flex; - height: 38px; - justify-content: center; - padding: 0; - transform: none; - width: 38px; - - .icon-close { - padding: 0; - } - } +// Forms +.form-label { + font-weight: $font-weight-bold; } diff --git a/resources/assets/themes/card-glow.scss b/resources/assets/themes/card-glow.scss new file mode 100644 index 00000000..2ab4bdf2 --- /dev/null +++ b/resources/assets/themes/card-glow.scss @@ -0,0 +1,33 @@ +// Used for shift overview cards headers +@each $state, $value in $theme-colors { + $card-background: darken($value, 35%); + $card-border: $value; + $card-color: $value; + + @if (contrast-ratio($card-background, $card-color) < $min-contrast-ratio*.7) { + $card-color: mix($value, color-contrast($card-background), 40%); + } + + .card.bg-#{"" + $state} .card-header { + background-color: $card-background; + border-color: $card-border; + + .badge.bg-light { + background-color: $card-color !important; + } + + .badge.text-#{"" + $state} { + color: $card-background !important; + } + + a.text-white { + color: $card-color !important; + } + + .btn-#{"" + $state} { + background-color: $card-background; + border-color: $card-border !important; + color: $card-color; + } + } +} diff --git a/resources/assets/themes/cyborg_styles.less b/resources/assets/themes/cyborg_styles.scss similarity index 73% rename from resources/assets/themes/cyborg_styles.less rename to resources/assets/themes/cyborg_styles.scss index d0e1776d..b34ba050 100644 --- a/resources/assets/themes/cyborg_styles.less +++ b/resources/assets/themes/cyborg_styles.scss @@ -45,37 +45,6 @@ THE SOFTWARE. // Bootswatch // ----------------------------------------------------- -// Navbar ===================================================================== - -// Buttons ==================================================================== - -// Typography ================================================================= - -.text-primary, -.text-primary:hover { - color: @brand-primary; -} - -.text-success, -.text-success:hover { - color: @brand-success; -} - -.text-danger, -.text-danger:hover { - color: @brand-danger; -} - -.text-warning, -.text-warning:hover { - color: @brand-warning; -} - -.text-info, -.text-info:hover { - color: @brand-info; -} - // Tables ===================================================================== table, @@ -88,12 +57,12 @@ table, } .text-muted { - color: @text-muted; + color: $text-muted; } } .table-responsive > .table { - background-color: @table-bg; + background-color: $table-bg; } // Forms ====================================================================== @@ -102,13 +71,13 @@ table, .help-block, .control-label, .form-control-feedback { - color: @brand-warning; + color: $warning; } .form-control, .form-control:focus, .input-group-addon { - border-color: @brand-warning; + border-color: $warning; } } @@ -116,13 +85,13 @@ table, .help-block, .control-label, .form-control-feedback { - color: @brand-danger; + color: $danger; } .form-control, .form-control:focus, .input-group-addon { - border-color: @brand-danger; + border-color: $danger; } } @@ -130,13 +99,13 @@ table, .help-block, .control-label, .form-control-feedback { - color: @brand-success; + color: $success; } .form-control, .form-control:focus, .input-group-addon { - border-color: @brand-success; + border-color: $success; } } @@ -158,7 +127,7 @@ table, .alert-link, a { - color: @alert-warning-text; + color: $alert-warning-text; text-decoration: underline; } @@ -183,21 +152,9 @@ table, // Containers ================================================================= -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: @thumbnail-border; -} - .jumbotron { h1, h2, h3, h4, h5, h6 { color: #fff; } } - -// code tag -code { - background-color: @input-bg-disabled; - color: @input-color; -} diff --git a/resources/assets/themes/cyborg_variables.less b/resources/assets/themes/cyborg_variables.less deleted file mode 100644 index 89bc1d84..00000000 --- a/resources/assets/themes/cyborg_variables.less +++ /dev/null @@ -1,873 +0,0 @@ -// cyborg_variables -@import "../../../node_modules/bootstrap/less/variables"; - - -/* -The MIT License (MIT) - -Copyright (c) 2013 Thomas Park - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -// Cyborg 3.2.0 -// Variables -// -------------------------------------------------- - -//== Colors -// -//## Gray and brand colors for use across Bootstrap. - // needs change -@gray-darker: #222; // #222 -@gray-dark: #333; // #333 -@gray: #555; // #555 -@gray-light: #999; // #999 -@gray-lighter: #eee; // #eee - -@brand-primary: #99ba00; -@brand-success: #99ba00; -@brand-info: #0076ba; -@brand-warning: #ffc600; -@brand-danger: #d9534f; - - -//== Scaffolding -// -//## Settings for some of the most global styles. - -//** Background color for ``. -@body-bg: #060606; -//** Global text color on ``. -@text-color: @gray-light; - -//** Global textual link color. -@link-color: @brand-primary; -//** Link hover color set via `darken()` function. -@link-hover-color: @link-color; - - -//== Typography -// -//## Font, line-height, and color for body text, headings, and more. - -@font-family-serif: Georgia, "Times New Roman", Times, serif; -//** Default monospace fonts for ``, ``, and `
    `.
    -@font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;
    -@font-family-base:        @font-family-sans-serif;
    -
    -@font-size-base:          14px;
    -@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px
    -@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px
    -
    -@font-size-h1:            34px;
    -@font-size-h2:            24px;
    -@font-size-h3:            20px;
    -@font-size-h4:            20px;
    -@font-size-h5:            20px;
    -@font-size-h6:            16px;
    -
    -//** Unit-less `line-height` for use in components like buttons.
    -@line-height-base:        1.428571429; // 20/14
    -//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
    -@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px
    -
    -//** By default, this inherits from the ``.
    -@headings-font-family:    @font-family-base;
    -@headings-font-weight:    500;
    -@headings-line-height:    1.1;
    -@headings-color:          #fff;
    -
    -
    -//== Iconography
    -//
    -//## Specify custom location and filename of the included Glyphicons icon font.
    -//## Useful for those including Bootstrap via Bower.
    -
    -//** File name for all font files.
    -@icon-font-name:          "glyphicons-halflings-regular";
    -//** Element ID within SVG icon file.
    -@icon-font-svg-id:        "glyphicons_halflingsregular";
    -
    -
    -//== Components
    -//
    -//## Define common padding and border radius sizes and more.
    -//## Values based on 14px text and 1.428 line-height (~20px to start).
    -
    -@padding-base-vertical:     8px;
    -@padding-base-horizontal:   12px;
    -
    -@padding-large-vertical:    14px;
    -@padding-large-horizontal:  16px;
    -
    -@padding-small-vertical:    5px;
    -@padding-small-horizontal:  10px;
    -
    -@padding-xs-vertical:       1px;
    -@padding-xs-horizontal:     5px;
    -
    -@line-height-large:         1.33;
    -@line-height-small:         1.5;
    -
    -@border-radius-base:        4px;
    -@border-radius-large:       6px;
    -@border-radius-small:       3px;
    -
    -//** Global color for active items (e.g., navs or dropdowns).
    -@component-active-color:    #fff;
    -//** Global background color for active items (e.g., navs or dropdowns).
    -@component-active-bg:       @brand-primary;
    -
    -//** Width of the `border` for generating carets that indicator dropdowns.
    -@caret-width-base:          4px;
    -//** Carets increase slightly in size for larger components.
    -@caret-width-large:         5px;
    -
    -
    -//== Tables
    -//
    -//## Customizes the `.table` component with basic values, each used across all table variations.
    -
    -//** Padding for ``s and ``s.
    -@table-cell-padding:            8px;
    -//** Padding for cells in `.table-condensed`.
    -@table-condensed-cell-padding:  5px;
    -
    -//** Default background color used for all tables.
    -@table-bg:                      darken(@gray-darker, 4%);
    -//** Background color used for `.table-striped`.
    -@table-bg-accent:               darken(@table-bg, 6%);
    -//** Background color used for `.table-hover`.
    -@table-bg-hover:                @gray-dark;
    -@table-bg-active:               @table-bg-hover;
    -
    -//** Border color for table and cell borders.
    -@table-border-color:            @gray-dark;
    -
    -
    -//== Buttons
    -//
    -//## For each of Bootstrap's buttons, define text, background and border color.
    -
    -@btn-font-weight:                normal;
    -
    -@btn-default-color:              #000;
    -@btn-default-bg:                 @gray-light;
    -@btn-default-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-primary-color:              @btn-default-color;
    -@btn-primary-bg:                 @brand-primary;
    -@btn-primary-border:             darken(@btn-primary-bg, 10%);
    -
    -@btn-success-color:              @btn-default-color;
    -@btn-success-bg:                 @brand-success;
    -@btn-success-border:             darken(@btn-success-bg, 10%);
    -
    -@btn-info-color:                 @btn-default-color;
    -@btn-info-bg:                    @brand-info;
    -@btn-info-border:                darken(@btn-info-bg, 10%);
    -
    -@btn-warning-color:              @btn-default-color;
    -@btn-warning-bg:                 @brand-warning;
    -@btn-warning-border:             darken(@btn-warning-bg, 10%);
    -
    -@btn-danger-color:               @btn-default-color;
    -@btn-danger-bg:                  @brand-danger;
    -@btn-danger-border:              darken(@btn-danger-bg, 10%);
    -
    -@btn-link-disabled-color:        @gray-light;
    -
    -
    -//== Forms
    -//
    -//##
    -
    -//** `` background color
    -@input-bg:                       #000;
    -//** `` background color
    -@input-bg-disabled:              @gray-darker;
    -
    -//** Text color for ``s
    -@input-color:                    @text-color;
    -//** `` border color
    -@input-border:                   @gray-dark;
    -//** `` border radius
    -@input-border-radius:            @border-radius-base;
    -//** Border color for inputs on focus
    -@input-border-focus:             #66afe9;
    -
    -//** Placeholder text color
    -@input-color-placeholder:        @gray-light;
    -
    -//** Default `.form-control` height
    -@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);
    -//** Large `.form-control` height
    -@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);
    -//** Small `.form-control` height
    -@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);
    -
    -@legend-color:                   @text-color;
    -@legend-border-color:            @gray-dark;
    -
    -//** Background color for textual input addons
    -@input-group-addon-bg:           @gray-light;
    -//** Border color for textual input addons
    -@input-group-addon-border-color: @input-border;
    -
    -
    -//== Dropdowns
    -//
    -//## Dropdown menu container and contents.
    -
    -//** Background for the dropdown menu.
    -@dropdown-bg:                    @gray-darker;
    -//** Dropdown menu `border-color`.
    -@dropdown-border:                rgba(255,255,255,0.1);
    -//** Dropdown menu `border-color` **for IE8**.
    -@dropdown-fallback-border:       #444;
    -//** Divider color for between dropdown items.
    -@dropdown-divider-bg:            rgba(255,255,255,0.1);
    -
    -//** Dropdown link text color.
    -@dropdown-link-color:            #fff;
    -//** Hover color for dropdown links.
    -@dropdown-link-hover-color:      #fff;
    -//** Hover background for dropdown links.
    -@dropdown-link-hover-bg:         @dropdown-link-active-bg;
    -
    -//** Active dropdown menu item text color.
    -@dropdown-link-active-color:     #fff;
    -//** Active dropdown menu item background color.
    -@dropdown-link-active-bg:        @component-active-bg;
    -
    -//** Disabled dropdown menu item background color.
    -@dropdown-link-disabled-color:   @text-muted;
    -
    -//** Text color for headers within dropdown menus.
    -@dropdown-header-color:          @text-muted;
    -
    -//** Deprecated `@dropdown-caret-color` as of v3.1.0
    -@dropdown-caret-color:           #000;
    -
    -
    -//-- Z-index master list
    -//
    -// Warning: Avoid customizing these values. They're used for a bird's eye view
    -// of components dependent on the z-axis and are designed to all work together.
    -//
    -// Note: These variables are not generated into the Customizer.
    -
    -@zindex-navbar:            1000;
    -@zindex-dropdown:          1000;
    -@zindex-popover:           1060;
    -@zindex-tooltip:           1070;
    -@zindex-navbar-fixed:      1030;
    -@zindex-modal-background:  1040;
    -@zindex-modal:             1050;
    -
    -
    -//== Media queries breakpoints
    -//
    -//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
    -
    -// Extra small screen / phone
    -//** Deprecated `@screen-xs` as of v3.0.1
    -@screen-xs:                  480px;
    -//** Deprecated `@screen-xs-min` as of v3.2.0
    -@screen-xs-min:              @screen-xs;
    -//** Deprecated `@screen-phone` as of v3.0.1
    -@screen-phone:               @screen-xs-min;
    -
    -// Small screen / tablet
    -//** Deprecated `@screen-sm` as of v3.0.1
    -@screen-sm:                  768px;
    -@screen-sm-min:              @screen-sm;
    -//** Deprecated `@screen-tablet` as of v3.0.1
    -@screen-tablet:              @screen-sm-min;
    -
    -// Medium screen / desktop
    -//** Deprecated `@screen-md` as of v3.0.1
    -@screen-md:                  992px;
    -@screen-md-min:              @screen-md;
    -//** Deprecated `@screen-desktop` as of v3.0.1
    -@screen-desktop:             @screen-md-min;
    -
    -// Large screen / wide desktop
    -//** Deprecated `@screen-lg` as of v3.0.1
    -@screen-lg:                  1200px;
    -@screen-lg-min:              @screen-lg;
    -//** Deprecated `@screen-lg-desktop` as of v3.0.1
    -@screen-lg-desktop:          @screen-lg-min;
    -
    -// So media queries don't overlap when required, provide a maximum
    -@screen-xs-max:              (@screen-sm-min - 1);
    -@screen-sm-max:              (@screen-md-min - 1);
    -@screen-md-max:              (@screen-lg-min - 1);
    -
    -
    -//== Grid system
    -//
    -//## Define your custom responsive grid.
    -
    -//** Number of columns in the grid.
    -@grid-columns:              12;
    -//** Padding between columns. Gets divided in half for the left and right.
    -@grid-gutter-width:         30px;
    -// Navbar collapse
    -//** Point at which the navbar becomes uncollapsed.
    -@grid-float-breakpoint:     @screen-sm-min;
    -//** Point at which the navbar begins collapsing.
    -@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
    -
    -
    -//== Container sizes
    -//
    -//## Define the maximum width of `.container` for different screen sizes.
    -
    -// Small screen / tablet
    -@container-tablet:             ((720px + @grid-gutter-width));
    -//** For `@screen-sm-min` and up.
    -@container-sm:                 @container-tablet;
    -
    -// Medium screen / desktop
    -@container-desktop:            ((940px + @grid-gutter-width));
    -//** For `@screen-md-min` and up.
    -@container-md:                 @container-desktop;
    -
    -// Large screen / wide desktop
    -@container-large-desktop:      ((1140px + @grid-gutter-width));
    -//** For `@screen-lg-min` and up.
    -@container-lg:                 @container-large-desktop;
    -
    -
    -//== Navbar
    -//
    -//##
    -
    -// Basics of a navbar
    -@navbar-height:                    50px;
    -@navbar-margin-bottom:             @line-height-computed;
    -@navbar-border-radius:             @border-radius-base;
    -@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));
    -@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);
    -@navbar-collapse-max-height:       340px;
    -
    -@navbar-default-color:             @text-color;
    -@navbar-default-bg:                @body-bg;
    -@navbar-default-border:            @gray-dark;
    -
    -// Navbar links
    -@navbar-default-link-color:                @text-color;
    -@navbar-default-link-hover-color:          #fff;
    -@navbar-default-link-hover-bg:             transparent;
    -@navbar-default-link-active-color:         #fff;
    -@navbar-default-link-active-bg:            transparent;
    -@navbar-default-link-disabled-color:       @gray-light;
    -@navbar-default-link-disabled-bg:          transparent;
    -
    -// Navbar brand label
    -@navbar-default-brand-color:               #fff;
    -@navbar-default-brand-hover-color:         #fff;
    -@navbar-default-brand-hover-bg:            transparent;
    -
    -// Navbar toggle
    -@navbar-default-toggle-hover-bg:           @gray-dark;
    -@navbar-default-toggle-icon-bar-bg:        #ccc;
    -@navbar-default-toggle-border-color:       @gray-dark;
    -
    -
    -// Inverted navbar
    -// Reset inverted navbar basics
    -@navbar-inverse-color:                      @gray-light;
    -@navbar-inverse-bg:                         @gray-darker;
    -@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);
    -
    -// Inverted navbar links
    -@navbar-inverse-link-color:                 @gray-light;
    -@navbar-inverse-link-hover-color:           #fff;
    -@navbar-inverse-link-hover-bg:              transparent;
    -@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;
    -@navbar-inverse-link-active-bg:             transparent;
    -@navbar-inverse-link-disabled-color:        #aaa;
    -@navbar-inverse-link-disabled-bg:           transparent;
    -
    -// Inverted navbar brand label
    -@navbar-inverse-brand-color:                #fff;
    -@navbar-inverse-brand-hover-color:          #fff;
    -@navbar-inverse-brand-hover-bg:             transparent;
    -
    -// Inverted navbar toggle
    -@navbar-inverse-toggle-hover-bg:            #333;
    -@navbar-inverse-toggle-icon-bar-bg:         #fff;
    -@navbar-inverse-toggle-border-color:        #333;
    -
    -
    -//== Navs
    -//
    -//##
    -
    -//=== Shared nav styles
    -@nav-link-padding:                          10px 15px;
    -@nav-link-hover-bg:                         @gray-darker;
    -
    -@nav-disabled-link-color:                   @gray-light;
    -@nav-disabled-link-hover-color:             @gray-light;
    -
    -@nav-open-link-hover-color:                 @gray-darker;
    -
    -//== Tabs
    -@nav-tabs-border-color:                     @gray-dark;
    -
    -@nav-tabs-link-hover-border-color:          transparent;
    -
    -@nav-tabs-active-link-hover-bg:             @brand-primary;
    -@nav-tabs-active-link-hover-color:          #fff;
    -@nav-tabs-active-link-hover-border-color:   @gray-dark;
    -
    -@nav-tabs-justified-link-border-color:            #ddd;
    -@nav-tabs-justified-active-link-border-color:     @body-bg;
    -
    -//== Pills
    -@nav-pills-border-radius:                   @border-radius-base;
    -@nav-pills-active-link-hover-bg:            @component-active-bg;
    -@nav-pills-active-link-hover-color:         @component-active-color;
    -
    -
    -//== Pagination
    -//
    -//##
    -
    -@pagination-color:                     #fff;
    -@pagination-bg:                        @gray-darker;
    -@pagination-border:                    @gray-dark;
    -
    -@pagination-hover-color:               #000;
    -@pagination-hover-bg:                  @component-active-bg;
    -@pagination-hover-border:              transparent;
    -
    -@pagination-active-color:              #000;
    -@pagination-active-bg:                 @brand-primary;
    -@pagination-active-border:             transparent;
    -
    -@pagination-disabled-color:            @gray-light;
    -@pagination-disabled-bg:               @gray-darker;
    -@pagination-disabled-border:           @gray-dark;
    -
    -
    -//== Pager
    -//
    -//##
    -
    -@pager-bg:                             @pagination-bg;
    -@pager-border:                         @pagination-border;
    -@pager-border-radius:                  15px;
    -
    -@pager-hover-bg:                       @pagination-hover-bg;
    -
    -@pager-active-bg:                      @pagination-active-bg;
    -@pager-active-color:                   @pagination-active-color;
    -
    -@pager-disabled-color:                 @gray-light;
    -
    -
    -//== Jumbotron
    -//
    -//##
    -
    -@jumbotron-padding:              30px;
    -@jumbotron-color:                inherit;
    -@jumbotron-bg:                   darken(@gray-darker, 5%);
    -@jumbotron-heading-color:        inherit;
    -@jumbotron-font-size:            ceil((@font-size-base * 1.5));
    -
    -
    -//== Form states and alerts
    -//
    -//## Define colors for form feedback states and, by default, alerts.
    -
    -@state-success-text:             @brand-success;
    -@state-success-bg:               darken(@brand-success, 40%);
    -@state-success-border:           @brand-success;
    -
    -@state-info-text:                @brand-info;
    -@state-info-bg:                  darken(@brand-info, 40%);
    -@state-info-border:              @brand-info;
    -
    -@state-warning-text:             @brand-warning;
    -@state-warning-bg:               darken(@brand-warning, 40%);
    -@state-warning-border:           @brand-warning;
    -
    -@state-danger-text:              @brand-danger;
    -@state-danger-bg:                darken(@brand-danger, 40%);
    -@state-danger-border:            @brand-danger;
    -
    -
    -//== Tooltips
    -//
    -//##
    -
    -//** Tooltip max width
    -@tooltip-max-width:           200px;
    -//** Tooltip text color
    -@tooltip-color:               #fff;
    -//** Tooltip background color
    -@tooltip-bg:                  rgba(0,0,0,.9);
    -@tooltip-opacity:             .9;
    -
    -//** Tooltip arrow width
    -@tooltip-arrow-width:         5px;
    -//** Tooltip arrow color
    -@tooltip-arrow-color:         @tooltip-bg;
    -
    -
    -//== Popovers
    -//
    -//##
    -
    -//** Popover body background color
    -@popover-bg:                          lighten(@body-bg, 10%);
    -//** Popover maximum width
    -@popover-max-width:                   276px;
    -//** Popover border color
    -@popover-border-color:                rgba(0,0,0,.2);
    -//** Popover fallback border color
    -@popover-fallback-border-color:       #999;
    -
    -//** Popover title background color
    -@popover-title-bg:                    darken(@popover-bg, 3%);
    -
    -//** Popover arrow width
    -@popover-arrow-width:                 10px;
    -//** Popover arrow color
    -@popover-arrow-color:                 @popover-bg;
    -
    -//** Popover outer arrow width
    -@popover-arrow-outer-width:           (@popover-arrow-width + 1);
    -//** Popover outer arrow color
    -@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);
    -//** Popover outer arrow fallback color
    -@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);
    -
    -
    -//== Labels
    -//
    -//##
    -
    -//** Default label background color
    -@label-default-bg:            @btn-default-bg;
    -//** Primary label background color
    -@label-primary-bg:            @brand-primary;
    -//** Success label background color
    -@label-success-bg:            @brand-success;
    -//** Info label background color
    -@label-info-bg:               @brand-info;
    -//** Warning label background color
    -@label-warning-bg:            @brand-warning;
    -//** Danger label background color
    -@label-danger-bg:             @brand-danger;
    -
    -//** Default label text color
    -@label-color:                 #fff;
    -//** Default text color of a linked label
    -@label-link-hover-color:      #fff;
    -
    -
    -//== Modals
    -//
    -//##
    -
    -//** Padding applied to the modal body
    -@modal-inner-padding:         20px;
    -
    -//** Padding applied to the modal title
    -@modal-title-padding:         15px;
    -//** Modal title line-height
    -@modal-title-line-height:     @line-height-base;
    -
    -//** Background color of modal content area
    -@modal-content-bg:                             lighten(@body-bg, 10%);
    -//** Modal content border color
    -@modal-content-border-color:                   rgba(0,0,0,.2);
    -//** Modal content border color **for IE8**
    -@modal-content-fallback-border-color:          #999;
    -
    -//** Modal backdrop background color
    -@modal-backdrop-bg:           #000;
    -//** Modal backdrop opacity
    -@modal-backdrop-opacity:      .5;
    -//** Modal header border color
    -@modal-header-border-color:   @gray-dark;
    -//** Modal footer border color
    -@modal-footer-border-color:   @modal-header-border-color;
    -
    -@modal-lg:                    900px;
    -@modal-md:                    600px;
    -@modal-sm:                    300px;
    -
    -
    -//== Alerts
    -//
    -//## Define alert colors, border radius, and padding.
    -
    -@alert-padding:               15px;
    -@alert-border-radius:         @border-radius-base;
    -@alert-link-font-weight:      bold;
    -
    -@alert-success-bg:            @state-success-bg;
    -@alert-success-text:          @state-success-text;
    -@alert-success-border:        @state-success-border;
    -
    -@alert-info-bg:               @state-info-bg;
    -@alert-info-text:             @state-info-text;
    -@alert-info-border:           @state-info-border;
    -
    -@alert-warning-bg:            @state-warning-bg;
    -@alert-warning-text:          @state-warning-text;
    -@alert-warning-border:        @state-warning-border;
    -
    -@alert-danger-bg:             @state-danger-bg;
    -@alert-danger-text:           @state-danger-text;
    -@alert-danger-border:         @state-danger-border;
    -
    -
    -//== Progress bars
    -//
    -//##
    -
    -//** Background color of the whole progress component
    -@progress-bg:                 @gray-darker;
    -//** Progress bar text color
    -@progress-bar-color:          #fff;
    -
    -//** Default progress bar color
    -@progress-bar-bg:             @brand-primary;
    -//** Success progress bar color
    -@progress-bar-success-bg:     @brand-success;
    -//** Warning progress bar color
    -@progress-bar-warning-bg:     @brand-warning;
    -//** Danger progress bar color
    -@progress-bar-danger-bg:      @brand-danger;
    -//** Info progress bar color
    -@progress-bar-info-bg:        @brand-info;
    -
    -
    -//== List group
    -//
    -//##
    -
    -//** Background color on `.list-group-item`
    -@list-group-bg:                 @gray-darker;
    -//** `.list-group-item` border color
    -@list-group-border:             @gray-dark;
    -//** List group border radius
    -@list-group-border-radius:      @border-radius-base;
    -
    -//** Background color of single list items on hover
    -@list-group-hover-bg:           lighten(@list-group-bg, 15%);
    -//** Text color of active list items
    -@list-group-active-color:       @component-active-color;
    -//** Background color of active list items
    -@list-group-active-bg:          @component-active-bg;
    -//** Border color of active list elements
    -@list-group-active-border:      @list-group-active-bg;
    -//** Text color for content within active list items
    -@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);
    -
    -//** Text color of disabled list items
    -@list-group-disabled-color:      @gray-light;
    -//** Background color of disabled list items
    -@list-group-disabled-bg:         @gray-lighter;
    -//** Text color for content within disabled list items
    -@list-group-disabled-text-color: @list-group-disabled-color;
    -
    -@list-group-link-color:         @text-color;
    -@list-group-link-hover-color:   @list-group-link-color;
    -@list-group-link-heading-color: #fff;
    -
    -
    -//== Panels
    -//
    -//##
    -
    -@panel-bg:                    @gray-darker;
    -@panel-body-padding:          15px;
    -@panel-heading-padding:       10px 15px;
    -@panel-footer-padding:        @panel-heading-padding;
    -@panel-border-radius:         @border-radius-base;
    -
    -//** Border color for elements within panels
    -@panel-inner-border:          @gray-dark;
    -
    -@panel-default-text:          @text-color;
    -@panel-default-border:        @panel-inner-border;
    -@panel-default-heading-bg:    lighten(@gray-darker, 10%);
    -
    -@panel-footer-bg:             @panel-default-heading-bg;
    -
    -@panel-primary-text:          #fff;
    -@panel-primary-border:        @brand-primary;
    -@panel-primary-heading-bg:    @brand-primary;
    -
    -@panel-success-text:          @state-success-text;
    -@panel-success-border:        @state-success-border;
    -@panel-success-heading-bg:    @state-success-bg;
    -
    -@panel-info-text:             @state-info-text;
    -@panel-info-border:           @state-info-border;
    -@panel-info-heading-bg:       @state-info-bg;
    -
    -@panel-warning-text:          @state-warning-text;
    -@panel-warning-border:        @state-warning-border;
    -@panel-warning-heading-bg:    @state-warning-bg;
    -
    -@panel-danger-text:           @state-danger-text;
    -@panel-danger-border:         @state-danger-border;
    -@panel-danger-heading-bg:     @state-danger-bg;
    -
    -
    -//== Thumbnails
    -//
    -//##
    -
    -//** Padding around the thumbnail image
    -@thumbnail-padding:           4px;
    -//** Thumbnail background color
    -@thumbnail-bg:                @gray-dark;
    -//** Thumbnail border color
    -@thumbnail-border:            @gray-dark;
    -//** Thumbnail border radius
    -@thumbnail-border-radius:     @border-radius-base;
    -
    -//** Custom text color for thumbnail captions
    -@thumbnail-caption-color:     @text-color;
    -//** Padding around the thumbnail caption
    -@thumbnail-caption-padding:   9px;
    -
    -
    -//== Wells
    -//
    -//##
    -
    -@well-bg:                     darken(@gray-darker, 5%);
    -@well-border:                 darken(@well-bg, 7%);
    -
    -
    -//== Badges
    -//
    -//##
    -
    -@badge-color:                 #000;
    -//** Linked badge text color on hover
    -@badge-link-hover-color:      #000;
    -@badge-bg:                    @brand-primary;
    -
    -//** Badge text color in active nav link
    -@badge-active-color:          @brand-primary;
    -//** Badge background color in active nav link
    -@badge-active-bg:             #fff;
    -
    -@badge-font-weight:           bold;
    -@badge-line-height:           1;
    -@badge-border-radius:         10px;
    -
    -
    -//== Breadcrumbs
    -//
    -//##
    -
    -@breadcrumb-padding-vertical:   8px;
    -@breadcrumb-padding-horizontal: 15px;
    -//** Breadcrumb background color
    -@breadcrumb-bg:                 @gray-darker;
    -//** Breadcrumb text color
    -@breadcrumb-color:              #fff;
    -//** Text color of current page in the breadcrumb
    -@breadcrumb-active-color:       @text-color;
    -//** Textual separator for between breadcrumb elements
    -@breadcrumb-separator:          "/";
    -
    -
    -//== Carousel
    -//
    -//##
    -
    -@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);
    -
    -@carousel-control-color:                      #fff;
    -@carousel-control-width:                      15%;
    -@carousel-control-opacity:                    .5;
    -@carousel-control-font-size:                  20px;
    -
    -@carousel-indicator-active-bg:                #fff;
    -@carousel-indicator-border-color:             #fff;
    -
    -@carousel-caption-color:                      #fff;
    -
    -
    -//== Close
    -//
    -//##
    -
    -@close-font-weight:           bold;
    -@close-color:                 #000;
    -@close-text-shadow:           0 1px 0 #fff;
    -
    -
    -//== Code
    -//
    -//##
    -
    -@code-color:                  #c7254e;
    -@code-bg:                     #f9f2f4;
    -
    -@kbd-color:                   #fff;
    -@kbd-bg:                      #333;
    -
    -@pre-bg:                      #f5f5f5;
    -@pre-color:                   @gray-dark;
    -@pre-border-color:            #ccc;
    -@pre-scrollable-max-height:   340px;
    -
    -
    -//== Type
    -//
    -//##
    -
    -//** Horizontal offset for forms and lists.
    -@component-offset-horizontal: 180px;
    -//** Text muted color
    -@text-muted:                  @gray-light;
    -//** Abbreviations and acronyms border color
    -@abbr-border-color:           @gray-light;
    -//** Headings small color
    -@headings-small-color:        @brand-primary;
    -//** Blockquote small color
    -@blockquote-small-color:      @gray;
    -//** Blockquote font size
    -@blockquote-font-size:        (@font-size-base * 1.25);
    -//** Blockquote border color
    -@blockquote-border-color:     @gray-dark;
    -//** Page header border color
    -@page-header-border-color:    @gray-dark;
    -//** Width of horizontal description list titles
    -@dl-horizontal-offset:        @component-offset-horizontal;
    -//** Horizontal line color.
    -@hr-border:                   @gray-dark;
    -
    -@import "base";
    diff --git a/resources/assets/themes/cyborg_variables.scss b/resources/assets/themes/cyborg_variables.scss
    new file mode 100644
    index 00000000..0b27d890
    --- /dev/null
    +++ b/resources/assets/themes/cyborg_variables.scss
    @@ -0,0 +1,696 @@
    +// cyborg_variables
    +
    +/*
    +The MIT License (MIT)
    +
    +Copyright (c) 2013 Thomas Park
    +
    +Permission is hereby granted, free of charge, to any person obtaining a copy
    +of this software and associated documentation files (the "Software"), to deal
    +in the Software without restriction, including without limitation the rights
    +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    +copies of the Software, and to permit persons to whom the Software is
    +furnished to do so, subject to the following conditions:
    +
    +The above copyright notice and this permission notice shall be included in
    +all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    +THE SOFTWARE.
    +*/
    +
    +@use "sass:math";
    +
    +// Cyborg 3.2.0
    +// Variables
    +// --------------------------------------------------
    +
    +//== Colors
    +
    +//## Gray and brand colors for use across Bootstrap.
    +$gray-darker:  #222 !default;
    +$gray-dark:    #333 !default;
    +$gray:         #555 !default;
    +$gray-light:   #999 !default;
    +$gray-lighter: #eee !default;
    +
    +$primary: #437aca !default;
    +$success: #99ba00 !default;
    +$info:    #0076ba !default;
    +$warning: #ffc600 !default;
    +$danger:  #d9534f !default;
    +
    +//== Scaffolding
    +//
    +//## Settings for some of the most global styles.
    +
    +$body-bg:    #060606 !default;
    +$body-color: $gray-light !default;
    +
    +//** Global text color on ``.
    +$text-color: $gray-light !default;
    +$text-muted: $gray-light !default;
    +
    +//** Global textual link color.
    +$link-color:       $primary !default;
    +//** Link hover color set via `darken()` function.
    +$link-hover-color: $link-color !default;
    +
    +
    +//== Typography
    +//
    +//## Font, line-height, and color for body text, headings, and more.
    +
    +$font-size-base:  1rem !default;
    +$font-size-large: ceil(($font-size-base * 1.25)) !default; // ~18px
    +$font-size-small: ceil(($font-size-base * 0.85)) !default; // ~12px
    +
    +$font-size-h1: 34px !default;
    +$font-size-h2: 24px !default;
    +$font-size-h3: 20px !default;
    +$font-size-h4: 20px !default;
    +$font-size-h5: 20px !default;
    +$font-size-h6: 16px !default;
    +
    +//** Unit-less `line-height` for use in components like buttons.
    +$line-height-base: 1.5 !default;
    +
    +//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
    +$line-height-computed: floor(($font-size-base * $line-height-base)) !default; // ~20px
    +
    +//** By default, this inherits from the ``.
    +$headings-font-weight: 500 !default;
    +$headings-line-height: 1.1 !default;
    +$headings-color:       #fff !default;
    +
    +
    +//== Components
    +//
    +//## Define common padding and border radius sizes and more.
    +//## Values based on 14px text and 1.428 line-height (~20px to start).
    +
    +$line-height-large: 1.33 !default;
    +$line-height-small: 1.5 !default;
    +
    +$border-radius-base:  4px !default;
    +$border-radius-large: 6px !default;
    +$border-radius-small: 3px !default;
    +
    +//** Global color for active items (e.g., navs or dropdowns).
    +$component-active-color: #fff !default;
    +//** Global background color for active items (e.g., navs or dropdowns).
    +$component-active-bg:    $primary !default;
    +
    +//** Width of the `border` for generating carets that indicator dropdowns.
    +$caret-width-base:  4px !default;
    +//** Carets increase slightly in size for larger components.
    +$caret-width-large: 5px !default;
    +
    +
    +//== Tables
    +//
    +//## Customizes the `.table` component with basic values, each used across all table variations.
    +
    +//** Padding for ``s and ``s.
    +$table-cell-padding:            8px !default;
    +//** Padding for cells in `.table-condensed`.
    +$table-condensed-cell-padding:  5px !default;
    +
    +//** Default background color used for all tables.
    +$table-bg:        darken($gray-darker, 4%) !default;
    +//** Background color used for `.table-striped`.
    +$table-bg-accent: darken($table-bg, 6%) !default;
    +//** Background color used for `.table-hover`.
    +$table-bg-hover:  $gray-dark !default;
    +$table-bg-active: $table-bg-hover !default;
    +
    +//** Border color for table and cell borders.
    +$table-border-color: $gray-dark !default;
    +
    +//== Forms
    +//
    +//##
    +
    +//** `` background color
    +$input-bg:          $gray-darker !default;
    +//** `` background color
    +$input-bg-disabled: $gray-darker !default;
    +
    +//** Text color for ``s
    +$input-color:         $text-color !default;
    +//** `` border color
    +$input-border-color:  $gray-dark !default;
    +//** `` border radius
    +$input-border-radius: $border-radius-base !default;
    +//** Border color for inputs on focus
    +$input-border-focus:  #66afe9 !default;
    +
    +//** Placeholder text color
    +$input-color-placeholder: $gray-light !default;
    +
    +$legend-color:        $text-color !default;
    +$legend-border-color: $gray-dark !default;
    +
    +//** Background color for textual input addons
    +$input-group-addon-bg: $gray-light !default;
    +//** Border color for textual input addons
    +$input-group-addon-border-color: $input-border-color !default;
    +
    +$form-label-font-weight: bold !default;
    +
    +//== Dropdowns
    +//
    +//## Dropdown menu container and contents.
    +
    +$dropdown-bg:              $gray-darker !default;
    +$dropdown-border:          rgba(255,255,255,0.1) !default;
    +$dropdown-fallback-border: #444;
    +$dropdown-divider-bg:      rgba(255,255,255,0.1) !default;
    +
    +//** Active dropdown menu item text color.
    +$dropdown-link-active-color: #fff !default;
    +//** Active dropdown menu item background color.
    +$dropdown-link-active-bg:    $component-active-bg !default;
    +
    +//** Dropdown link text color.
    +$dropdown-link-color:       #fff !default;
    +//** Hover color for dropdown links.
    +$dropdown-link-hover-color: #fff !default;
    +//** Hover background for dropdown links.
    +$dropdown-link-hover-bg:    $dropdown-link-active-bg !default;
    +
    +//** Disabled dropdown menu item background color.
    +$dropdown-link-disabled-color: $text-muted !default;
    +
    +//** Text color for headers within dropdown menus.
    +$dropdown-header-color:        $text-muted !default;
    +
    +//** Deprecated `$dropdown-caret-color` as of v3.1.0
    +$dropdown-caret-color:           #000 !default;
    +
    +
    +//-- Z-index master list
    +//
    +// Warning: Avoid customizing these values. They're used for a bird's eye view
    +// of components dependent on the z-axis and are designed to all work together.
    +//
    +// Note: These variables are not generated into the Customizer.
    +
    +$zindex-navbar:            1000 !default;
    +$zindex-dropdown:          1000 !default;
    +$zindex-popover:           1060 !default;
    +$zindex-tooltip:           1070 !default;
    +$zindex-navbar-fixed:      1030 !default;
    +$zindex-modal-background:  1040 !default;
    +$zindex-modal:             1050 !default;
    +
    +
    +//== Media queries breakpoints
    +//
    +//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
    +
    +// Extra small screen / phone
    +//** Deprecated `$screen-xs` as of v3.0.1
    +$screen-xs:                  480px !default;
    +//** Deprecated `$screen-xs-min` as of v3.2.0
    +$screen-xs-min:              $screen-xs !default;
    +//** Deprecated `$screen-phone` as of v3.0.1
    +$screen-phone:               $screen-xs-min !default;
    +
    +// Small screen / tablet
    +//** Deprecated `$screen-sm` as of v3.0.1
    +$screen-sm:                  768px !default;
    +$screen-sm-min:              $screen-sm !default;
    +//** Deprecated `$screen-tablet` as of v3.0.1
    +$screen-tablet:              $screen-sm-min !default;
    +
    +// Medium screen / desktop
    +//** Deprecated `$screen-md` as of v3.0.1
    +$screen-md:                  992px !default;
    +$screen-md-min:              $screen-md !default;
    +//** Deprecated `$screen-desktop` as of v3.0.1
    +$screen-desktop:             $screen-md-min !default;
    +
    +// Large screen / wide desktop
    +//** Deprecated `$screen-lg` as of v3.0.1
    +$screen-lg:                  1200px !default;
    +$screen-lg-min:              $screen-lg !default;
    +//** Deprecated `$screen-lg-desktop` as of v3.0.1
    +$screen-lg-desktop:          $screen-lg-min !default;
    +
    +// So media queries don't overlap when required, provide a maximum
    +$screen-xs-max:              ($screen-sm-min - 1) !default;
    +$screen-sm-max:              ($screen-md-min - 1) !default;
    +$screen-md-max:              ($screen-lg-min - 1) !default;
    +
    +
    +//== Grid system
    +//
    +//## Define your custom responsive grid.
    +
    +//** Number of columns in the grid.
    +$grid-columns:              12 !default;
    +//** Padding between columns. Gets divided in half for the left and right.
    +$grid-gutter-width:         30px !default;
    +// Navbar collapse
    +//** Point at which the navbar becomes uncollapsed.
    +$grid-float-breakpoint:     $screen-sm-min !default;
    +//** Point at which the navbar begins collapsing.
    +$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
    +
    +
    +//== Container sizes
    +//
    +//## Define the maximum width of `.container` for different screen sizes.
    +
    +// Small screen / tablet
    +$container-tablet:             ((720px + $grid-gutter-width)) !default;
    +//** For `$screen-sm-min` and up.
    +$container-sm:                 $container-tablet !default;
    +
    +// Medium screen / desktop
    +$container-desktop:            ((940px + $grid-gutter-width)) !default;
    +//** For `$screen-md-min` and up.
    +$container-md:                 $container-desktop !default;
    +
    +// Large screen / wide desktop
    +$container-large-desktop:      ((1140px + $grid-gutter-width)) !default;
    +//** For `$screen-lg-min` and up.
    +$container-lg:                 $container-large-desktop !default;
    +
    +
    +//== Navbar
    +//
    +//##
    +
    +// Basics of a navbar
    +$navbar-height:              3.125rem !default;
    +$navbar-margin-bottom:       $line-height-computed !default;
    +$navbar-border-radius:       $border-radius-base !default;
    +$navbar-padding-horizontal:  floor(math.div($grid-gutter-width, 2)) !default;
    +$navbar-padding-vertical:    math.div($navbar-height - $line-height-computed, 2) !default;
    +$navbar-collapse-max-height: 340px !default;
    +
    +$navbar-default-color:  $text-color !default;
    +$navbar-default-bg:     $body-bg !default;
    +$navbar-default-border: $gray-dark !default;
    +
    +// Navbar links
    +$navbar-default-link-color:          $text-color !default;
    +$navbar-default-link-hover-color:    #fff !default;
    +$navbar-default-link-hover-bg:       transparent !default;
    +$navbar-default-link-active-color:   #fff !default;
    +$navbar-default-link-active-bg:      transparent !default;
    +$navbar-default-link-disabled-color: $gray-light !default;
    +$navbar-default-link-disabled-bg:    transparent !default;
    +
    +// Navbar brand label
    +$navbar-default-brand-color:       #fff !default;
    +$navbar-default-brand-hover-color: #fff !default;
    +$navbar-default-brand-hover-bg:    transparent !default;
    +
    +// Navbar toggle
    +$navbar-default-toggle-hover-bg:     $gray-dark !default;
    +$navbar-default-toggle-icon-bar-bg:  #ccc !default;
    +$navbar-default-toggle-border-color: $gray-dark !default;
    +
    +
    +// Inverted navbar
    +// Reset inverted navbar basics
    +$navbar-inverse-color:  $gray-light !default;
    +$navbar-inverse-bg:     $gray-darker !default;
    +$navbar-inverse-border: darken($navbar-inverse-bg, 10%) !default;
    +
    +// Inverted navbar links
    +$navbar-inverse-link-color:          $gray-light !default;
    +$navbar-inverse-link-hover-color:    #fff !default;
    +$navbar-inverse-link-hover-bg:       transparent !default;
    +$navbar-inverse-link-active-color:   $navbar-inverse-link-hover-color !default;
    +$navbar-inverse-link-active-bg:      transparent !default;
    +$navbar-inverse-link-disabled-color: #aaa !default;
    +$navbar-inverse-link-disabled-bg:    transparent !default;
    +
    +// Inverted navbar brand label
    +$navbar-inverse-brand-color:       #fff !default;
    +$navbar-inverse-brand-hover-color: #fff !default;
    +$navbar-inverse-brand-hover-bg:    transparent !default;
    +
    +// Inverted navbar toggle
    +$navbar-inverse-toggle-hover-bg:     #333 !default;
    +$navbar-inverse-toggle-icon-bar-bg:  #fff !default;
    +$navbar-inverse-toggle-border-color: #333 !default;
    +
    +
    +//== Navs
    +//
    +//##
    +
    +//=== Shared nav styles
    +$nav-link-padding:  10px 15px !default;
    +$nav-link-hover-bg: $gray-darker !default;
    +
    +$nav-disabled-link-color:       $gray-light !default;
    +$nav-disabled-link-hover-color: $gray-light !default;
    +
    +$nav-open-link-hover-color: $gray-darker !default;
    +
    +//== Tabs
    +$nav-tabs-border-color: $gray-dark !default;
    +
    +$nav-tabs-link-hover-border-color: transparent !default;
    +
    +$nav-tabs-active-link-hover-bg:           $primary !default;
    +$nav-tabs-active-link-hover-color:        #fff !default;
    +$nav-tabs-active-link-hover-border-color: $gray-dark !default;
    +
    +$nav-tabs-justified-link-border-color:        #ddd !default;
    +$nav-tabs-justified-active-link-border-color: $body-bg !default;
    +
    +//== Pills
    +$nav-pills-border-radius:           $border-radius-base !default;
    +$nav-pills-active-link-hover-bg:    $component-active-bg !default;
    +$nav-pills-active-link-hover-color: $component-active-color !default;
    +
    +
    +//== Pagination
    +//
    +//##
    +
    +$pagination-color:           #fff !default;
    +$pagination-bg:              $gray-darker !default;
    +$pagination-border:          $gray-dark !default;
    +
    +$pagination-hover-color:     #000 !default;
    +$pagination-hover-bg:        $component-active-bg !default;
    +$pagination-hover-border:    transparent !default;
    +
    +$pagination-active-color:    #000 !default;
    +$pagination-active-bg:       $primary !default;
    +$pagination-active-border:   transparent !default;
    +
    +$pagination-disabled-color:  $gray-light !default;
    +$pagination-disabled-bg:     $gray-darker !default;
    +$pagination-disabled-border: $gray-dark !default;
    +
    +
    +//== Pager
    +//
    +//##
    +
    +$pager-bg:             $pagination-bg !default;
    +$pager-border:         $pagination-border !default;
    +$pager-border-radius:  15px !default;
    +
    +$pager-hover-bg:       $pagination-hover-bg !default;
    +
    +$pager-active-bg:      $pagination-active-bg !default;
    +$pager-active-color:   $pagination-active-color !default;
    +
    +$pager-disabled-color: $gray-light !default;
    +
    +
    +//== Jumbotron
    +//
    +//##
    +
    +$jumbotron-padding:       30px !default;
    +$jumbotron-color:         inherit !default;
    +$jumbotron-bg:            darken($gray-darker, 5%) !default;
    +$jumbotron-heading-color: inherit !default;
    +$jumbotron-font-size:     ceil(($font-size-base * 1.5)) !default;
    +
    +
    +//== Form states and alerts
    +//
    +//## Define colors for form feedback states and, by default, alerts.
    +
    +$state-success-text:   $success !default;
    +$state-success-bg:     darken($success, 40%) !default;
    +$state-success-border: $success !default;
    +
    +$state-info-text:      $info !default;
    +$state-info-bg:        darken($info, 40%) !default;
    +$state-info-border:    $info !default;
    +
    +$state-warning-text:   $warning !default;
    +$state-warning-bg:     darken($warning, 40%) !default;
    +$state-warning-border: $warning !default;
    +
    +$state-danger-text:    $danger !default;
    +$state-danger-bg:      darken($danger, 40%) !default;
    +$state-danger-border:  $danger !default;
    +
    +
    +//== Tooltips
    +//
    +//##
    +
    +$tooltip-max-width: 200px !default;
    +$tooltip-color:     #fff !default;
    +$tooltip-bg:        rgba(0,0,0,.9) !default;
    +$tooltip-opacity:   .9 !default;
    +
    +$tooltip-arrow-width: 5px !default;
    +$tooltip-arrow-color: $tooltip-bg !default;
    +
    +
    +//== Popovers
    +//
    +//##
    +
    +$popover-bg:                    lighten($body-bg, 10%) !default;
    +$popover-max-width:             276px !default;
    +$popover-border-color:          rgba(0,0,0,.2) !default;
    +$popover-fallback-border-color: #999 !default !default;
    +
    +//** Popover title background color
    +$popover-title-bg:                    darken($popover-bg, 3%) !default;
    +
    +//** Popover arrow width
    +$popover-arrow-width:                 10px !default;
    +//** Popover arrow color
    +$popover-arrow-color:                 $popover-bg !default;
    +
    +//** Popover outer arrow width
    +$popover-arrow-outer-width:           ($popover-arrow-width + 1) !default;
    +//** Popover outer arrow color
    +$popover-arrow-outer-color:           fadein($popover-border-color, 5%) !default;
    +//** Popover outer arrow fallback color
    +$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%) !default;
    +
    +
    +//== Labels
    +//
    +//##
    +
    +$label-primary-bg:            $primary !default;
    +$label-success-bg:            $success !default;
    +$label-info-bg:               $info !default;
    +$label-warning-bg:            $warning !default;
    +$label-danger-bg:             $danger !default;
    +
    +//** Default label text color
    +$label-color:                 #fff !default;
    +//** Default text color of a linked label
    +$label-link-hover-color:      #fff !default;
    +
    +
    +//== Modals
    +//
    +//##
    +
    +//** Padding applied to the modal body
    +$modal-inner-padding:         1.25rem !default;
    +
    +//** Padding applied to the modal title
    +$modal-title-padding:         15px !default;
    +//** Modal title line-height
    +$modal-title-line-height:     $line-height-base !default;
    +
    +//** Background color of modal content area
    +$modal-content-bg:                             lighten($body-bg, 10%) !default;
    +//** Modal content border color
    +$modal-content-border-color:                   rgba(0,0,0,.2) !default;
    +//** Modal content border color **for IE8**
    +$modal-content-fallback-border-color:          #999 !default;
    +
    +//** Modal backdrop background color
    +$modal-backdrop-bg:           #000 !default;
    +//** Modal backdrop opacity
    +$modal-backdrop-opacity:      .5 !default;
    +//** Modal header border color
    +$modal-header-border-color:   $gray-dark !default;
    +//** Modal footer border color
    +$modal-footer-border-color:   $modal-header-border-color !default;
    +
    +$modal-lg:                    900px !default;
    +$modal-md:                    600px !default;
    +$modal-sm:                    300px !default;
    +
    +
    +//== Alerts
    +//
    +//## Define alert colors, border radius, and padding.
    +
    +$alert-padding:          15px !default;
    +$alert-border-radius:    $border-radius-base !default;
    +$alert-link-font-weight: bold !default;
    +
    +$alert-success-bg:       $state-success-bg !default;
    +$alert-success-text:     $state-success-text !default;
    +$alert-success-border:   $state-success-border !default;
    +
    +$alert-info-bg:          $state-info-bg !default;
    +$alert-info-text:        $state-info-text !default;
    +$alert-info-border:      $state-info-border !default;
    +
    +$alert-warning-bg:       $state-warning-bg !default;
    +$alert-warning-text:     $state-warning-text !default;
    +$alert-warning-border:   $state-warning-border !default;
    +
    +$alert-danger-bg:        $state-danger-bg !default;
    +$alert-danger-text:      $state-danger-text !default;
    +$alert-danger-border:    $state-danger-border !default;
    +
    +
    +//== Progress bars
    +//
    +//##
    +
    +//** Background color of the whole progress component
    +$progress-bg:                 $gray-darker !default;
    +//** Progress bar text color
    +$progress-bar-color:          #fff !default;
    +
    +//** Default progress bar color
    +$progress-bar-bg:             $primary !default;
    +//** Success progress bar color
    +$progress-bar-success-bg:     $success !default;
    +//** Warning progress bar color
    +$progress-bar-warning-bg:     $warning !default;
    +//** Danger progress bar color
    +$progress-bar-danger-bg:      $danger !default;
    +//** Info progress bar color
    +$progress-bar-info-bg:        $info !default;
    +
    +
    +//== List group
    +//
    +//##
    +
    +//** Background color on `.list-group-item`
    +$list-group-bg:                 $gray-darker !default;
    +//** `.list-group-item` border color
    +$list-group-border:             $gray-dark !default;
    +//** List group border radius
    +$list-group-border-radius:      $border-radius-base !default;
    +
    +//** Background color of single list items on hover
    +$list-group-hover-bg:           lighten($list-group-bg, 15%) !default;
    +//** Text color of active list items
    +$list-group-active-color:       $component-active-color !default;
    +//** Background color of active list items
    +$list-group-active-bg:          $component-active-bg !default;
    +//** Border color of active list elements
    +$list-group-active-border:      $list-group-active-bg !default;
    +//** Text color for content within active list items
    +$list-group-active-text-color:  lighten($list-group-active-bg, 40%) !default;
    +
    +//** Text color of disabled list items
    +$list-group-disabled-color:      $gray-light !default;
    +//** Background color of disabled list items
    +$list-group-disabled-bg:         $gray-lighter !default;
    +//** Text color for content within disabled list items
    +$list-group-disabled-text-color: $list-group-disabled-color !default;
    +
    +$list-group-link-color:         $text-color !default;
    +$list-group-link-hover-color:   $list-group-link-color !default;
    +$list-group-link-heading-color: #fff !default;
    +
    +
    +//== Breadcrumbs
    +//
    +//##
    +
    +$breadcrumb-padding-vertical:   8px !default;
    +$breadcrumb-padding-horizontal: 15px !default;
    +$breadcrumb-bg:                 $gray-darker !default;
    +$breadcrumb-color:              #fff !default;
    +//** Text color of current page in the breadcrumb
    +$breadcrumb-active-color:       $text-color !default;
    +//** Textual separator for between breadcrumb elements
    +$breadcrumb-separator:          "/" !default;
    +
    +
    +//== Carousel
    +//
    +//##
    +
    +$carousel-text-shadow:            0 1px 2px rgba(0,0,0,.6) !default;
    +
    +$carousel-control-color:          #fff !default;
    +$carousel-control-width:          15% !default;
    +$carousel-control-opacity:        .5 !default;
    +$carousel-control-font-size:      20px !default;
    +
    +$carousel-indicator-active-bg:    #fff !default;
    +$carousel-indicator-border-color: #fff !default;
    +
    +$carousel-caption-color:          #fff !default;
    +
    +
    +//== Close
    +//
    +//##
    +
    +$close-font-weight:           bold !default;
    +$close-color:                 #000 !default;
    +$close-text-shadow:           0 1px 0 #fff !default;
    +
    +
    +//== Code
    +//
    +//##
    +
    +$code-color:                  #c7254e !default;
    +$code-bg:                     #f9f2f4 !default;
    +
    +$kbd-color:                   #fff !default;
    +$kbd-bg:                      #333 !default;
    +
    +$pre-bg:                      #f5f5f5 !default;
    +$pre-color:                   $gray-dark !default;
    +$pre-border-color:            #ccc !default;
    +$pre-scrollable-max-height:   340px !default;
    +
    +
    +//== Type
    +//
    +//##
    +
    +//** Horizontal offset for forms and lists.
    +$component-offset-horizontal: 180px !default;
    +
    +//** Abbreviations and acronyms border color
    +$abbr-border-color:           $gray-light !default;
    +//** Headings small color
    +$headings-small-color:        $primary !default;
    +//** Blockquote small color
    +$blockquote-small-color:      $gray !default;
    +//** Blockquote font size
    +$blockquote-font-size:        ($font-size-base * 1.25) !default;
    +//** Blockquote border color
    +$blockquote-border-color:     $gray-dark !default;
    +//** Page header border color
    +$page-header-border-color:    $gray-dark !default;
    +//** Width of horizontal description list titles
    +$dl-horizontal-offset:        $component-offset-horizontal !default;
    +//** Horizontal line color.
    +$hr-border:                   $gray-dark !default;
    +
    +@import "base.scss";
    diff --git a/resources/assets/themes/dark.scss b/resources/assets/themes/dark.scss
    new file mode 100644
    index 00000000..13267a8e
    --- /dev/null
    +++ b/resources/assets/themes/dark.scss
    @@ -0,0 +1,5 @@
    +// All dark themes
    +$input-group-addon-color: #222;
    +$input-disabled-bg: #111;
    +$alert-bg-scale: 70%;
    +$secondary: #222;
    diff --git a/resources/assets/themes/error.less b/resources/assets/themes/error.scss
    similarity index 100%
    rename from resources/assets/themes/error.less
    rename to resources/assets/themes/error.scss
    diff --git a/resources/assets/themes/light.scss b/resources/assets/themes/light.scss
    new file mode 100644
    index 00000000..69c5f598
    --- /dev/null
    +++ b/resources/assets/themes/light.scss
    @@ -0,0 +1,7 @@
    +// All light themes
    +
    +$secondary: #bec4ce;
    +
    +.btn.btn-secondary {
    +  background-color: rgba(255, 255, 255, 0.3);
    +}
    diff --git a/resources/assets/themes/theme0.less b/resources/assets/themes/theme0.less
    deleted file mode 100644
    index 9d37f0b4..00000000
    --- a/resources/assets/themes/theme0.less
    +++ /dev/null
    @@ -1,2 +0,0 @@
    -// light
    -@import "base.less";
    diff --git a/resources/assets/themes/theme0.scss b/resources/assets/themes/theme0.scss
    new file mode 100644
    index 00000000..41d7cee9
    --- /dev/null
    +++ b/resources/assets/themes/theme0.scss
    @@ -0,0 +1,16 @@
    +// light theme
    +@import "light";
    +
    +$primary: #337ab7;
    +$light: #f5f5f5;
    +
    +@import "base.scss";
    +
    +
    +h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
    +  &.bg-primary,
    +  &.bg-success,
    +  &.bg-danger {
    +      color: #fff;
    +  }
    +}
    diff --git a/resources/assets/themes/theme1.less b/resources/assets/themes/theme1.less
    deleted file mode 100644
    index a5dc8266..00000000
    --- a/resources/assets/themes/theme1.less
    +++ /dev/null
    @@ -1,98 +0,0 @@
    -// dark
    -@import "cyborg_variables.less";
    -
    -// Variables
    -// --------------------------------------------------
    -
    -//== changed Colors
    -
    -@gray-dark:              #282828;   // #333
    -@gray-light:             #888;   // #999
    -@gray-lighter:           #ADAFAE; // #eee
    -
    -@brand-primary:         #428bca;
    -@brand-success:         #5cb85c;
    -@brand-info:            #5bc0de;
    -@brand-warning:         #f0ad4e;
    -
    -
    -//== changed Buttons
    -
    -@btn-default-color:              #fff;
    -@btn-default-bg:                 lighten(@gray-dark, 10%);
    -
    -@btn-primary-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-success-border:             @btn-primary-border;
    -
    -@btn-info-border:                @btn-primary-border;
    -
    -@btn-warning-border:             @btn-primary-border;
    -
    -@btn-danger-border:              @btn-primary-border;
    -
    -@btn-link-disabled-color:        @gray-light;
    -
    -
    -//== changed Forms
    -
    -@input-bg:                       @gray-darker;
    -
    -@input-bg-disabled:              lighten(@gray-lighter,15%);
    -
    -@input-group-addon-bg:           @gray-lighter;
    -
    -
    -//== changed Pagination
    -
    -@pagination-hover-color:               #fff;
    -
    -@pagination-active-color:              #fff;
    -
    -
    -//== changed Form states and alerts
    -
    -@state-success-text:             #fff;
    -@state-success-bg:               @brand-success;
    -@state-success-border:           darken(@state-success-bg, 5%);
    -
    -@state-info-text:                #fff;
    -@state-info-bg:                  @brand-info;
    -@state-info-border:              darken(@state-info-bg, 7%);
    -
    -@state-warning-text:             #fff;
    -@state-warning-bg:               @brand-warning;
    -@state-warning-border:           darken(@state-warning-bg, 3%);
    -
    -@state-danger-text:              #fff;
    -@state-danger-bg:                @brand-danger;
    -@state-danger-border:            darken(@state-danger-bg, 3%);
    -
    -
    -//== changed Badges
    -
    -@badge-color:                 #fff;
    -
    -@badge-link-hover-color:      #fff;
    -
    -
    -//== changed Type
    -
    -@headings-small-color:        @gray-light;
    -
    -
    -// Bootswatch
    -// -----------------------------------------------------
    -@import "cyborg_styles.less";
    -
    -// added Forms ======================================================================
    -
    -.input-group-addon {
    -  background-color: @btn-default-bg;
    -}
    -
    -// different code tag
    -code {
    -  background-color: @state-info-bg;
    -  color: @state-info-text;
    -}
    diff --git a/resources/assets/themes/theme1.scss b/resources/assets/themes/theme1.scss
    new file mode 100644
    index 00000000..9e095cd8
    --- /dev/null
    +++ b/resources/assets/themes/theme1.scss
    @@ -0,0 +1,85 @@
    +// Variables
    +// --------------------------------------------------
    +
    +@import "dark";
    +
    +//== changed Colors
    +
    +$gray-darker:  #222;
    +$gray-dark:    #282828;
    +$gray-light:   #888;
    +$gray-lighter: #ADAFAE;
    +
    +$primary:   #437aca;
    +$secondary: #424242;
    +$success:   #00c960;
    +$info:      #3dbddf;
    +$warning:   #f6b345;
    +$danger:    #e93a44;
    +
    +$text-muted: $gray-light;
    +
    +$btn-link-disabled-color:        $gray-light;
    +
    +
    +//== changed Forms
    +
    +$input-bg:                       $gray-darker;
    +$input-bg-disabled:              lighten($gray-lighter,15%);
    +$input-group-addon-bg:           $gray-lighter;
    +
    +
    +//== changed Pagination
    +
    +$pagination-hover-color:               #fff;
    +$pagination-active-color:              #fff;
    +
    +
    +//== changed Form states and alerts
    +
    +$state-success-text:             #fff;
    +$state-success-bg:               $success;
    +$state-success-border:           darken($state-success-bg, 5%);
    +
    +$state-info-text:                #fff;
    +$state-info-bg:                  $info;
    +$state-info-border:              darken($state-info-bg, 7%);
    +
    +$state-warning-text:             #fff;
    +$state-warning-bg:               $warning;
    +$state-warning-border:           darken($state-warning-bg, 3%);
    +
    +$state-danger-text:              #fff;
    +$state-danger-bg:                $danger;
    +$state-danger-border:            darken($state-danger-bg, 3%);
    +
    +$headings-small-color:        $gray-light;
    +
    +code {
    +  background-color: $state-info-bg;
    +  color: $state-info-text;
    +}
    +
    +$alert-bg-scale: 0%;
    +$alert-border-scale: 0%;
    +$alert-color-scale: 0%;
    +
    +.alert {
    +  color: #fff !important;
    +
    +  .text-danger,
    +  .text-info {
    +      color: #fff !important;
    +  }
    +}
    +
    +// dark
    +@import "cyborg_variables";
    +@import "cyborg_styles";
    +
    +h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
    +  &.bg-warning,
    +  &.bg-info {
    +      color: #000;
    +  }
    +}
    diff --git a/resources/assets/themes/theme10.less b/resources/assets/themes/theme10.less
    deleted file mode 100644
    index 5f2a841d..00000000
    --- a/resources/assets/themes/theme10.less
    +++ /dev/null
    @@ -1,57 +0,0 @@
    -// cccamp19 green (2019)
    -@import "cyborg_variables.less";
    -
    -// Variables
    -// --------------------------------------------------
    -
    -//== changed Colors
    -
    -@gray-dark:              #282828;   // #333
    -@gray-light:             #888;   // #999
    -@gray-lighter:           #ADAFAE; // #eee
    -
    -@brand-primary:         #99ba00;
    -
    -@import "cyborg_styles.less";
    -
    -// Specials for cccamp19 design
    -
    -.navbar-brand {
    -  .icon-icon_angel {
    -    background-color: @brand-primary;
    -  }
    -
    -  strong {
    -    font-weight: lighter;
    -    color: @brand-primary;
    -    text-shadow:
    -      0 0 10px @brand-primary,
    -      0 0 20px @brand-primary,
    -      0 0 30px @brand-primary,
    -      0 0 40px @brand-primary,
    -      0 0 70px @brand-primary,
    -      0 0 80px @brand-primary;
    -  }
    -}
    -
    -h1 {
    -  font-weight: lighter;
    -  color: @brand-primary;
    -  text-shadow: 0 0 10px @brand-primary;
    -
    -  .icon-icon_angel {
    -    background-color: @brand-primary;
    -  }
    -}
    -
    -.panel-title {
    -  color: #fff;
    -}
    -
    -.input-group-addon {
    -  color: #000;
    -
    -  .icon-icon_angel {
    -    background-color: #000;
    -  }
    -}
    diff --git a/resources/assets/themes/theme10.scss b/resources/assets/themes/theme10.scss
    new file mode 100644
    index 00000000..5731cb25
    --- /dev/null
    +++ b/resources/assets/themes/theme10.scss
    @@ -0,0 +1,64 @@
    +// cccamp19 green (2019)
    +
    +// Variables
    +// --------------------------------------------------
    +@import "dark";
    +
    +//== changed Colors
    +
    +$gray-dark:    #282828;
    +$gray-light:   #888;
    +$gray-lighter: #ADAFAE;
    +
    +$brand-primary: #99ba00;
    +$primary:       $brand-primary;
    +
    +$text-muted: $primary;
    +
    +@import "cyborg_variables.scss";
    +@import "cyborg_styles.scss";
    +
    +// Specials for cccamp19 design
    +@import "card-glow";
    +
    +.navbar-brand {
    +  .icon-icon_angel {
    +    background-color: $brand-primary;
    +  }
    +
    +  strong {
    +    font-weight: normal;
    +    color: $brand-primary;
    +    text-shadow:
    +      0 0 10px $brand-primary,
    +      0 0 20px $brand-primary,
    +      0 0 30px $brand-primary,
    +      0 0 40px $brand-primary,
    +      0 0 70px $brand-primary,
    +      0 0 80px $brand-primary;
    +  }
    +}
    +
    +h1 {
    +  font-weight: normal;
    +  color: $brand-primary;
    +  text-shadow: 0 0 10px $brand-primary;
    +
    +  .icon-icon_angel {
    +    background-color: $brand-primary;
    +  }
    +}
    +
    +.input-group-addon {
    +  color: #000;
    +
    +  .icon-icon_angel {
    +    background-color: #000;
    +  }
    +}
    +
    +h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
    +    &.bg-warning {
    +        color: #000;
    +    }
    +}
    diff --git a/resources/assets/themes/theme11.less b/resources/assets/themes/theme11.less
    deleted file mode 100644
    index cd601924..00000000
    --- a/resources/assets/themes/theme11.less
    +++ /dev/null
    @@ -1,104 +0,0 @@
    -// high contrast
    -@import "cyborg_variables.less";
    -// Variables
    -// --------------------------------------------------
    -
    -//== Colors
    -
    -@gray-dark:              #282828;   // #333
    -@gray-light:             #888;   // #999
    -@gray-lighter:           #ADAFAE; // #eee
    -
    -@brand-primary:         #72abfa;
    -@brand-success:         #5cb85c;
    -@brand-info:            #5bc0de;
    -@brand-warning:         #f0ad4e;
    -
    -//== Scaffolding
    -
    -@body-bg:               #000;
    -@text-color:            #fff;
    -
    -//== Buttons
    -
    -@btn-default-color:              #fff;
    -@btn-default-bg:                 lighten(@gray-dark, 10%);
    -
    -@btn-primary-color:              #000;
    -@btn-primary-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-success-color:              #000;
    -@btn-success-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-info-color:                 #000;
    -@btn-info-border:                darken(@btn-default-bg, 10%);
    -
    -@btn-warning-color:              #000;
    -@btn-warning-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-danger-color:               #000;
    -@btn-danger-border:              darken(@btn-default-bg, 10%);
    -
    -
    -
    -//== Forms
    -
    -@input-bg:                       @gray-darker;
    -@input-bg-disabled:              @gray-lighter;
    -
    -@input-group-addon-bg:           @gray-lighter;
    -
    -
    -//== Pagination
    -
    -@pagination-hover-color:               #fff;
    -
    -
    -//== Labels
    -
    -@label-default-bg:            lighten(@btn-default-bg, 20%);
    -@label-color:                 #000;
    -@label-link-hover-color:      #000;
    -
    -//== Badges
    -
    -@badge-link-hover-color:      #fff;
    -
    -//== Type
    -
    -@text-muted:                  @gray-lighter;
    -@abbr-border-color:           @gray-lighter;
    -@headings-small-color:        @gray-lighter;
    -
    -// Bootswatch
    -// -----------------------------------------------------
    -@import "cyborg_styles.less";
    -// Typography =================================================================
    -
    -.text-danger,
    -.text-danger:hover {
    -  color: lighten(@brand-danger, 10%);
    -}
    -
    -// Forms ======================================================================
    -
    -.legend {
    -  margin-top: 20px;
    -}
    -
    -.input-group-addon {
    -  background-color: @btn-default-bg;
    -}
    -
    -
    -// Containers =================================================================
    -
    -.panel-info .panel-title {
    -  color: #000;
    -}
    -
    -// code tag
    -code {
    -  background-color: @btn-default-bg;
    -  color: @input-color;
    -}
    diff --git a/resources/assets/themes/theme11.scss b/resources/assets/themes/theme11.scss
    new file mode 100644
    index 00000000..765159b9
    --- /dev/null
    +++ b/resources/assets/themes/theme11.scss
    @@ -0,0 +1,114 @@
    +// high contrast
    +// Variables
    +// --------------------------------------------------
    +@import "dark";
    +
    +//== Colors
    +
    +$gray-dark:    #282828;
    +$gray-darker:  #222;
    +$gray-light:   #888;
    +$gray-lighter: #ADAFAE;
    +
    +$brand-primary: #72abfa;
    +$primary:       $brand-primary;
    +$brand-success: #5cb85c;
    +$success:       $brand-success;
    +$brand-info:    #5bc0de;
    +$info:          $brand-info;
    +$brand-danger:  #d9534f;
    +$danger:        $brand-danger;
    +$brand-warning: #f0ad4e;
    +$warning:       $brand-warning;
    +
    +//== Scaffolding
    +
    +$body-bg:               #000;
    +$body-color:            #fff;
    +
    +//== Buttons
    +
    +$btn-color:                      #fff;
    +$btn-default-bg:                 lighten($gray-dark, 10%);
    +
    +$btn-primary-color:              #000;
    +$btn-primary-border:             darken($btn-default-bg, 10%);
    +
    +$btn-success-color:              #000;
    +$btn-success-border:             darken($btn-default-bg, 10%);
    +
    +$btn-info-color:                 #000;
    +$btn-info-border:                darken($btn-default-bg, 10%);
    +
    +$btn-warning-color:              #000;
    +$btn-warning-border:             darken($btn-default-bg, 10%);
    +
    +$btn-danger-color:               #000;
    +$btn-danger-border:              darken($btn-default-bg, 10%);
    +
    +
    +//== Forms
    +
    +$input-bg:                       $gray-darker;
    +$input-bg-disabled:              $gray-lighter;
    +
    +$input-group-addon-bg:           $gray-lighter;
    +
    +
    +//== Pagination
    +
    +$pagination-hover-color:               #fff;
    +
    +
    +//== Labels
    +
    +$label-default-bg:            lighten($btn-default-bg, 20%);
    +$label-color:                 #000;
    +$label-link-hover-color:      #000;
    +
    +
    +//== Type
    +
    +$text-muted:                  $gray-lighter;
    +$abbr-border-color:           $gray-lighter;
    +$headings-small-color:        $gray-lighter;
    +
    +// Bootswatch
    +// -----------------------------------------------------
    +@import "cyborg_variables.scss";
    +@import "cyborg_styles.scss";
    +
    +// Typography =================================================================
    +
    +.text-danger,
    +.text-danger:hover {
    +  color: lighten($brand-danger, 10%);
    +}
    +
    +// Forms ======================================================================
    +
    +.legend {
    +  margin-top: 20px;
    +}
    +
    +.input-group-addon {
    +  background-color: $btn-default-bg;
    +}
    +
    +// code tag
    +code {
    +  background-color: $btn-default-bg;
    +  color: #fff;
    +}
    +
    +.navbar-dark .navbar-nav .nav-link {
    +  color: #fff;
    +}
    +
    +.badge {
    +  color: #000 !important;
    +
    +  &.bg-dark {
    +    color: #fff !important;
    +  }
    +}
    diff --git a/resources/assets/themes/theme12.less b/resources/assets/themes/theme12.less
    deleted file mode 100644
    index a770a4b1..00000000
    --- a/resources/assets/themes/theme12.less
    +++ /dev/null
    @@ -1,107 +0,0 @@
    -// 36c3
    -@import "cyborg_variables.less";
    -
    -//== Colors
    -
    -@gray-dark:              #282828;   // #333
    -@gray-light:             #888;   // #999
    -@gray-lighter:           #D0D0CE; // #eee
    -@black:                  #000;
    -
    -@brand-primary:         #fe5000;
    -@brand-success:         #00bb31;
    -@brand-info:            #5bc0de;
    -@brand-warning:         #febb00;
    -@brand-danger:          #bb3100;
    -
    -//== Scaffolding
    -
    -@body-bg:               #000;
    -@text-color:            @gray-lighter;
    -
    -//== Buttons
    -
    -@btn-default-color:              @gray-lighter;
    -@btn-default-bg:                 lighten(@gray-dark, 10%);
    -
    -@btn-primary-color:              @black;
    -@btn-primary-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-success-color:              @black;
    -@btn-success-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-info-color:                 @black;
    -@btn-info-border:                darken(@btn-default-bg, 10%);
    -
    -@btn-warning-color:              @black;
    -@btn-warning-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-danger-border:              darken(@btn-default-bg, 10%);
    -
    -
    -//== Forms
    -
    -@input-bg:                       @gray-darker;
    -@input-bg-disabled:              darken(@gray-dark, 10%);
    -@input-group-addon-bg:           @gray-lighter;
    -
    -//== Pagination
    -
    -@pagination-color:                     @black;
    -@pagination-hover-color:               @black;
    -@pagination-active-color:              @black;
    -
    -//== Labels
    -
    -@label-color:                 #000;
    -@label-link-hover-color:      @gray-dark;
    -
    -//== Panels
    -
    -@panel-primary-text:          #000;
    -
    -//== Badges
    -
    -@badge-color:                 @black;
    -@badge-link-hover-color:      @black;
    -
    -//== Type
    -
    -@headings-small-color:        @gray-light;
    -
    -// Bootswatch
    -// -----------------------------------------------------
    -@import "cyborg_styles.less";
    -// Forms ======================================================================
    -
    -.input-group-addon {
    -  background-color: @btn-default-bg;
    -}
    -
    -// Containers =================================================================
    -
    -// datetimepicker
    -
    -.bootstrap-datetimepicker-widget {
    -
    -  .timepicker-hour,
    -  .timepicker-minute,
    -  [data-action='selectHour'],
    -  [data-action='selectMinute'],
    -  [data-action='incrementHours'],
    -  [data-action='decrementHours'],
    -  [data-action='incrementMinutes'],
    -  [data-action='decrementMinutes'] {
    -
    -    &:hover {
    -
    -      color: @gray;
    -    }
    -  }
    -}
    -
    -// code tag
    -code {
    -  background-color: @btn-default-bg;
    -  color: @input-color;
    -}
    diff --git a/resources/assets/themes/theme12.scss b/resources/assets/themes/theme12.scss
    new file mode 100644
    index 00000000..114bf802
    --- /dev/null
    +++ b/resources/assets/themes/theme12.scss
    @@ -0,0 +1,109 @@
    +// 36c3
    +
    +//== Colors
    +@import "dark";
    +
    +$gray-dark:    #282828;
    +$gray-darker:  #222;
    +$gray-light:   #888;
    +$gray-lighter: #D0D0CE;
    +$black:        #000;
    +
    +$brand-primary: #fe5000;
    +$primary:       $brand-primary;
    +$brand-success: #00bb31;
    +$success:       $brand-success;
    +$brand-info:    #5bc0de;
    +$info:          $brand-info;
    +$brand-warning: #febb00;
    +$warning:       $brand-warning;
    +$brand-danger:  #bb3100;
    +$danger:        $brand-danger;
    +
    +//== Scaffolding
    +
    +$body-bg:               #000;
    +$text-color:            $gray-lighter;
    +
    +//== Buttons
    +
    +$btn-color:                      $gray-lighter;
    +$btn-default-bg:                 lighten($gray-dark, 10%);
    +
    +$btn-primary-color:              $black;
    +$btn-primary-border:             darken($btn-default-bg, 10%);
    +
    +$btn-success-color:              $black;
    +$btn-success-border:             darken($btn-default-bg, 10%);
    +
    +$btn-info-color:                 $black;
    +$btn-info-border:                darken($btn-default-bg, 10%);
    +
    +$btn-warning-color:              $black;
    +$btn-warning-border:             darken($btn-default-bg, 10%);
    +
    +$btn-danger-border:              darken($btn-default-bg, 10%);
    +
    +
    +//== Forms
    +
    +$input-bg:                       $gray-darker;
    +$input-bg-disabled:              darken($gray-dark, 10%);
    +$input-group-addon-bg:           $gray-lighter;
    +
    +//== Pagination
    +
    +$pagination-color:                     $black;
    +$pagination-hover-color:               $black;
    +$pagination-active-color:              $black;
    +
    +//== Labels
    +
    +$label-color:                 #000;
    +$label-link-hover-color:      $gray-dark;
    +
    +//== Badges
    +
    +$badge-color:                 $black;
    +
    +//== Type
    +
    +$headings-small-color:        $gray-light;
    +
    +// Bootswatch
    +// -----------------------------------------------------
    +@import "cyborg_variables.scss";
    +@import "cyborg_styles.scss";
    +// Forms ======================================================================
    +
    +.input-group-addon {
    +  background-color: $btn-default-bg;
    +}
    +
    +// Containers =================================================================
    +
    +// datetimepicker
    +
    +.bootstrap-datetimepicker-widget {
    +
    +  .timepicker-hour,
    +  .timepicker-minute,
    +  [data-action='selectHour'],
    +  [data-action='selectMinute'],
    +  [data-action='incrementHours'],
    +  [data-action='decrementHours'],
    +  [data-action='incrementMinutes'],
    +  [data-action='decrementMinutes'] {
    +
    +    &:hover {
    +
    +      color: $gray;
    +    }
    +  }
    +}
    +
    +// code tag
    +code {
    +  background-color: $btn-default-bg;
    +  color: $input-color;
    +}
    diff --git a/resources/assets/themes/theme13.less b/resources/assets/themes/theme13.less
    deleted file mode 100644
    index 22987f18..00000000
    --- a/resources/assets/themes/theme13.less
    +++ /dev/null
    @@ -1,164 +0,0 @@
    -// rc3
    -@import "cyborg_variables.less";
    -
    -//== Colors
    -
    -@gray-darker:            #100e23;
    -@gray-dark:              lighten(@gray-darker, 15%);
    -@gray:                   lighten(@gray-dark, 15%);
    -@gray-light:             lighten(@gray, 15%);
    -@gray-lighter:           lighten(@gray-light, 15%);
    -@black:                  #000;
    -
    -@brand-primary:         #6800e7;
    -@brand-success:         #05b9ec;
    -@brand-info:            #670295;
    -@brand-warning:         #fff900;
    -@brand-danger:          #b239ff;
    -
    -//== Scaffolding
    -
    -@body-bg:               #000;
    -@text-color:            @gray-lighter;
    -@link-color:            #fff;
    -
    -//== Typography
    -
    -@font-face {
    -    font-family: 'Montserrat';
    -    src: url('theme13/Montserrat-Regular.woff2') format('woff2'),
    -        url('theme13/Montserrat-Regular.woff') format('woff');
    -    font-weight: normal;
    -    font-style: normal;
    -    font-display: swap;
    -}
    -
    -@font-face {
    -    font-family: 'Orbitron';
    -    src: url('theme13/Orbitron-Regular.woff2') format('woff2'),
    -        url('theme13/Orbitron-Regular.woff') format('woff');
    -    font-weight: normal;
    -    font-style: normal;
    -    font-display: swap;
    -}
    -
    -@font-family-sans-serif: 'Montserrat', Helvetica Neue, Helvetica, Arial, sans-serif;
    -@font-family-serif:       'Orbitron', Georgia, "Times New Roman", Times, serif;
    -@headings-font-family:    @font-family-serif;
    -
    -//== Buttons
    -
    -@btn-default-color:              #fff;
    -@btn-default-bg:                 lighten(@gray-dark, 10%);
    -
    -@btn-primary-color:              #fff;
    -@btn-primary-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-success-color:              #fff;
    -@btn-success-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-info-color:                 #fff;
    -@btn-info-border:                darken(@btn-default-bg, 10%);
    -
    -@btn-warning-color:              #fff;
    -@btn-warning-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-danger-color:               #fff;
    -@btn-danger-border:              darken(@btn-default-bg, 10%);
    -
    -//== Forms
    -
    -@input-bg:                       @gray-darker;
    -@input-bg-disabled:              darken(@gray-dark, 10%);
    -
    -@input-group-addon-bg:           @gray-lighter;
    -
    -//== Pagination
    -
    -@pagination-color:                     @black;
    -
    -@pagination-hover-color:               @black;
    -
    -@pagination-active-color:              @black;
    -
    -//== Form states and alerts
    -
    -@state-success-text:             #fff;
    -
    -@state-info-text:                #fff;
    -
    -@state-warning-text:             #fff;
    -
    -@state-danger-text:              #fff;
    -
    -//== Labels
    -
    -@label-link-hover-color:      @gray-dark;
    -
    -//== Panels
    -
    -@panel-primary-text:          #000;
    -
    -@panel-success-text:          #fff;
    -
    -@panel-info-text:             #fff;
    -
    -@panel-warning-text:          #fff;
    -
    -@panel-danger-text:           #fff;
    -
    -//== Badges
    -
    -@badge-color:                 @black;
    -@badge-link-hover-color:      @black;
    -
    -//== Type
    -
    -@headings-small-color:        @gray-light;
    -
    -// Bootswatch
    -// -----------------------------------------------------
    -@import "cyborg_styles.less";
    -// Forms ======================================================================
    -
    -.input-group-addon {
    -  background-color: @btn-default-bg;
    -}
    -
    -// Containers =================================================================
    -
    -// datetimepicker
    -
    -.bootstrap-datetimepicker-widget {
    -
    -  .timepicker-hour,
    -  .timepicker-minute,
    -  [data-action='selectHour'],
    -  [data-action='selectMinute'],
    -  [data-action='incrementHours'],
    -  [data-action='decrementHours'],
    -  [data-action='incrementMinutes'],
    -  [data-action='decrementMinutes'] {
    -
    -    &:hover {
    -
    -      color: @gray;
    -    }
    -  }
    -}
    -
    -// code tag
    -code {
    -  background-color: @input-bg-disabled;
    -  color: @input-color;
    -}
    -
    -// Specials ===================================================================
    -body {
    -  background: #000 url('theme13/background.jpg') no-repeat top left;
    -}
    -
    -.navbar.navbar-default {
    -  background: rgba(0,0,0,0.8);
    -  backdrop-filter: blur(6px);
    -}
    diff --git a/resources/assets/themes/theme13.scss b/resources/assets/themes/theme13.scss
    new file mode 100644
    index 00000000..ddc44551
    --- /dev/null
    +++ b/resources/assets/themes/theme13.scss
    @@ -0,0 +1,164 @@
    +// rc3 violet
    +
    +//== Colors
    +@import "dark";
    +
    +$gray-darker:            #100e23;
    +$gray-dark:              lighten($gray-darker, 15%);
    +$gray:                   lighten($gray-dark, 15%);
    +$gray-light:             lighten($gray, 15%);
    +$gray-lighter:           lighten($gray-light, 15%);
    +$black:                  #000;
    +
    +$brand-primary: #6800e7;
    +$primary:       $brand-primary;
    +$brand-success: #05b9ec;
    +$secondary:     #3a327e;
    +$success:       $brand-success;
    +$brand-info:    #670295;
    +$info:          $brand-info;
    +$brand-warning: #fff900;
    +$warning:       $brand-warning;
    +$brand-danger:  #b239ff;
    +$danger:        $brand-danger;
    +
    +//== Scaffolding
    +
    +$body-bg:               #000;
    +$text-color:            $gray-lighter;
    +$link-color:            #fff;
    +
    +//== Typography
    +
    +@font-face {
    +    font-family: 'Montserrat';
    +    src: url('theme13/Montserrat-Regular.woff2') format('woff2'),
    +        url('theme13/Montserrat-Regular.woff') format('woff');
    +    font-weight: normal;
    +    font-style: normal;
    +    font-display: swap;
    +}
    +
    +@font-face {
    +    font-family: 'Orbitron';
    +    src: url('theme13/Orbitron-Regular.woff2') format('woff2'),
    +        url('theme13/Orbitron-Regular.woff') format('woff');
    +    font-weight: normal;
    +    font-style: normal;
    +    font-display: swap;
    +}
    +
    +$font-family-sans-serif: 'Montserrat', Helvetica Neue, Helvetica, Arial, sans-serif;
    +$font-family-serif:      'Orbitron', Georgia, "Times New Roman", Times, serif;
    +$headings-font-family:   $font-family-serif;
    +
    +//== Buttons
    +
    +$btn-color:                      #fff;
    +$btn-default-bg:                 lighten($gray-dark, 10%);
    +
    +$btn-primary-color:              #fff;
    +$btn-primary-border:             darken($btn-default-bg, 10%);
    +
    +$btn-success-color:              #fff;
    +$btn-success-border:             darken($btn-default-bg, 10%);
    +
    +$btn-info-color:                 #fff;
    +$btn-info-border:                darken($btn-default-bg, 10%);
    +
    +$btn-warning-color:              #fff;
    +$btn-warning-border:             darken($btn-default-bg, 10%);
    +
    +$btn-danger-color:               #fff;
    +$btn-danger-border:              darken($btn-default-bg, 10%);
    +
    +//== Forms
    +
    +$input-bg:                       $gray-darker;
    +$input-bg-disabled:              darken($gray-dark, 10%);
    +
    +$input-group-addon-bg:           $gray-lighter;
    +
    +//== Pagination
    +
    +$pagination-color:                     $black;
    +
    +$pagination-hover-color:               $black;
    +
    +$pagination-active-color:              $black;
    +
    +//== Form states and alerts
    +
    +$state-success-text:             #fff;
    +
    +$state-info-text:                #fff;
    +
    +$state-warning-text:             #fff;
    +
    +$state-danger-text:              #fff;
    +
    +//== Labels
    +
    +$label-link-hover-color:      $gray-dark;
    +
    +//== Badges
    +
    +$badge-color:                 $black;
    +
    +//== Type
    +
    +$headings-small-color:        $gray-light;
    +
    +// Bootswatch
    +// -----------------------------------------------------
    +@import "cyborg_variables.scss";
    +@import "cyborg_styles.scss";
    +// Forms ======================================================================
    +
    +.input-group-addon {
    +  background-color: $btn-default-bg;
    +}
    +
    +// Containers =================================================================
    +
    +// datetimepicker
    +
    +.bootstrap-datetimepicker-widget {
    +
    +  .timepicker-hour,
    +  .timepicker-minute,
    +  [data-action='selectHour'],
    +  [data-action='selectMinute'],
    +  [data-action='incrementHours'],
    +  [data-action='decrementHours'],
    +  [data-action='incrementMinutes'],
    +  [data-action='decrementMinutes'] {
    +
    +    &:hover {
    +
    +      color: $gray;
    +    }
    +  }
    +}
    +
    +// code tag
    +code {
    +  background-color: $input-bg-disabled;
    +  color: $input-color;
    +}
    +
    +// Specials ===================================================================
    +body {
    +  background: #000 url('theme13/background.jpg') no-repeat top left;
    +}
    +
    +.navbar.navbar-default {
    +  background: rgba(0,0,0,0.8);
    +  backdrop-filter: blur(6px);
    +}
    +
    +h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
    +    &.bg-warning {
    +        color: #000;
    +    }
    +}
    diff --git a/resources/assets/themes/theme14.less b/resources/assets/themes/theme14.less
    deleted file mode 100644
    index b68c0341..00000000
    --- a/resources/assets/themes/theme14.less
    +++ /dev/null
    @@ -1,165 +0,0 @@
    -// rc3 teal
    -@import "cyborg_variables.less";
    -
    -//== Colors
    -
    -@gray-darker:            #0e1c23;
    -@gray-dark:              lighten(@gray-darker, 15%);
    -@gray:                   lighten(@gray-dark, 15%);
    -@gray-light:             lighten(@gray, 15%);
    -@gray-lighter:           lighten(@gray-light, 15%);
    -@black:                  #000;
    -
    -@brand-primary:         #05b9ec;
    -@brand-success:         #02fae0;
    -@brand-info:            #025d83;
    -@brand-warning:         #6800e7;
    -@brand-danger:          #b239ff;
    -
    -
    -//== Scaffolding
    -
    -@body-bg:               #000;
    -@text-color:            @gray-lighter;
    -@link-color:            #fff;
    -
    -//== Typography
    -
    -@font-face {
    -    font-family: 'Montserrat';
    -    src: url('theme13/Montserrat-Regular.woff2') format('woff2'),
    -        url('theme13/Montserrat-Regular.woff') format('woff');
    -    font-weight: normal;
    -    font-style: normal;
    -    font-display: swap;
    -}
    -
    -@font-face {
    -    font-family: 'Orbitron';
    -    src: url('theme13/Orbitron-Regular.woff2') format('woff2'),
    -        url('theme13/Orbitron-Regular.woff') format('woff');
    -    font-weight: normal;
    -    font-style: normal;
    -    font-display: swap;
    -}
    -
    -@font-family-sans-serif: 'Montserrat', Helvetica Neue, Helvetica, Arial, sans-serif;
    -@font-family-serif:       'Orbitron', Georgia, "Times New Roman", Times, serif;
    -@headings-font-family:    @font-family-serif;
    -
    -//== Buttons
    -
    -@btn-default-color:              #fff;
    -@btn-default-bg:                 lighten(@gray-dark, 10%);
    -
    -@btn-primary-color:              #fff;
    -@btn-primary-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-success-color:              #fff;
    -@btn-success-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-info-color:                 #fff;
    -@btn-info-border:                darken(@btn-default-bg, 10%);
    -
    -@btn-warning-color:              #fff;
    -@btn-warning-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-danger-color:               #fff;
    -@btn-danger-border:              darken(@btn-default-bg, 10%);
    -
    -//== Forms
    -
    -@input-bg:                       @gray-darker;
    -@input-bg-disabled:              darken(@gray-dark, 10%);
    -
    -@input-group-addon-bg:           @gray-lighter;
    -
    -//== Pagination
    -
    -@pagination-color:                     @black;
    -
    -@pagination-hover-color:               @black;
    -
    -@pagination-active-color:              @black;
    -
    -//== Form states and alerts
    -
    -@state-success-text:             #fff;
    -
    -@state-info-text:                #fff;
    -
    -@state-warning-text:             #fff;
    -
    -@state-danger-text:              #fff;
    -
    -//== Labels
    -
    -@label-link-hover-color:      @gray-dark;
    -
    -//== Panels
    -
    -@panel-primary-text:          #000;
    -
    -@panel-success-text:          #fff;
    -
    -@panel-info-text:             #fff;
    -
    -@panel-warning-text:          #fff;
    -
    -@panel-danger-text:           #fff;
    -
    -//== Badges
    -
    -@badge-color:                 @black;
    -@badge-link-hover-color:      @black;
    -
    -//== Type
    -
    -@headings-small-color:        @gray-light;
    -
    -// Bootswatch
    -// -----------------------------------------------------
    -@import "cyborg_styles.less";
    -// Forms ======================================================================
    -
    -.input-group-addon {
    -  background-color: @btn-default-bg;
    -}
    -
    -// Containers =================================================================
    -
    -// datetimepicker
    -
    -.bootstrap-datetimepicker-widget {
    -
    -  .timepicker-hour,
    -  .timepicker-minute,
    -  [data-action='selectHour'],
    -  [data-action='selectMinute'],
    -  [data-action='incrementHours'],
    -  [data-action='decrementHours'],
    -  [data-action='incrementMinutes'],
    -  [data-action='decrementMinutes'] {
    -
    -    &:hover {
    -
    -      color: @gray;
    -    }
    -  }
    -}
    -
    -// code tag
    -code {
    -  background-color: @input-bg-disabled;
    -  color: @input-color;
    -}
    -
    -// Specials ===================================================================
    -body {
    -  background: #000 url('theme13/background14.jpg') no-repeat top left;
    -}
    -
    -.navbar.navbar-default {
    -  background: rgba(0,0,0,0.8);
    -  backdrop-filter: blur(6px);
    -}
    diff --git a/resources/assets/themes/theme14.scss b/resources/assets/themes/theme14.scss
    new file mode 100644
    index 00000000..265c3e38
    --- /dev/null
    +++ b/resources/assets/themes/theme14.scss
    @@ -0,0 +1,158 @@
    +// rc3 teal
    +
    +//== Colors
    +@import "dark";
    +
    +$gray-darker:            #0e1c23;
    +$gray-dark:              lighten($gray-darker, 15%);
    +$gray:                   lighten($gray-dark, 15%);
    +$gray-light:             lighten($gray, 15%);
    +$gray-lighter:           lighten($gray-light, 15%);
    +$black:                  #000;
    +
    +$brand-primary: #05b9ec;
    +$primary:       $brand-primary;
    +$secondary:     #32657e;
    +$brand-success: #02fae0;
    +$success:       $brand-success;
    +$brand-info:    #025d83;
    +$info:          $brand-info;
    +$brand-warning: #6800e7;
    +$warning:       $brand-warning;
    +$brand-danger:  #b239ff;
    +$danger:        $brand-danger;
    +
    +//== Scaffolding
    +
    +$body-bg:               #000;
    +$text-color:            $gray-lighter;
    +$link-color:            #fff;
    +
    +//== Typography
    +
    +@font-face {
    +    font-family: 'Montserrat';
    +    src: url('theme13/Montserrat-Regular.woff2') format('woff2'),
    +        url('theme13/Montserrat-Regular.woff') format('woff');
    +    font-weight: normal;
    +    font-style: normal;
    +    font-display: swap;
    +}
    +
    +@font-face {
    +    font-family: 'Orbitron';
    +    src: url('theme13/Orbitron-Regular.woff2') format('woff2'),
    +        url('theme13/Orbitron-Regular.woff') format('woff');
    +    font-weight: normal;
    +    font-style: normal;
    +    font-display: swap;
    +}
    +
    +$font-family-sans-serif: 'Montserrat', Helvetica Neue, Helvetica, Arial, sans-serif;
    +$font-family-serif:      'Orbitron', Georgia, "Times New Roman", Times, serif;
    +$headings-font-family:   $font-family-serif;
    +
    +//== Buttons
    +
    +$btn-color:                      #fff;
    +$btn-default-bg:                 lighten($gray-dark, 10%);
    +
    +$btn-primary-color:              #fff;
    +$btn-primary-border:             darken($btn-default-bg, 10%);
    +
    +$btn-success-color:              #fff;
    +$btn-success-border:             darken($btn-default-bg, 10%);
    +
    +$btn-info-color:                 #fff;
    +$btn-info-border:                darken($btn-default-bg, 10%);
    +
    +$btn-warning-color:              #fff;
    +$btn-warning-border:             darken($btn-default-bg, 10%);
    +
    +$btn-danger-color:               #fff;
    +$btn-danger-border:              darken($btn-default-bg, 10%);
    +
    +//== Forms
    +
    +$input-bg:                       $gray-darker;
    +$input-bg-disabled:              darken($gray-dark, 10%);
    +
    +$input-group-addon-bg:           $gray-lighter;
    +
    +//== Pagination
    +
    +$pagination-color:                     $black;
    +
    +$pagination-hover-color:               $black;
    +
    +$pagination-active-color:              $black;
    +
    +//== Form states and alerts
    +
    +$state-success-text:             #fff;
    +
    +$state-info-text:                #fff;
    +
    +$state-warning-text:             #fff;
    +
    +$state-danger-text:              #fff;
    +
    +//== Labels
    +
    +$label-link-hover-color:      $gray-dark;
    +
    +//== Badges
    +
    +$badge-color:                 $black;
    +
    +//== Type
    +
    +$headings-small-color:        $gray-light;
    +
    +// Bootswatch
    +// -----------------------------------------------------
    +@import "cyborg_variables.scss";
    +@import "cyborg_styles.scss";
    +// Forms ======================================================================
    +
    +.input-group-addon {
    +  background-color: $btn-default-bg;
    +}
    +
    +// Containers =================================================================
    +
    +// datetimepicker
    +
    +.bootstrap-datetimepicker-widget {
    +
    +  .timepicker-hour,
    +  .timepicker-minute,
    +  [data-action='selectHour'],
    +  [data-action='selectMinute'],
    +  [data-action='incrementHours'],
    +  [data-action='decrementHours'],
    +  [data-action='incrementMinutes'],
    +  [data-action='decrementMinutes'] {
    +
    +    &:hover {
    +
    +      color: $gray;
    +    }
    +  }
    +}
    +
    +// code tag
    +code {
    +  background-color: $input-bg-disabled;
    +  color: $input-color;
    +}
    +
    +// Specials ===================================================================
    +body {
    +  background: #000 url('theme13/background14.jpg') no-repeat top left;
    +}
    +
    +.navbar.navbar-default {
    +  background: rgba(0,0,0,0.8);
    +  backdrop-filter: blur(6px);
    +}
    diff --git a/resources/assets/themes/theme15.less b/resources/assets/themes/theme15.less
    deleted file mode 100644
    index c03b8c10..00000000
    --- a/resources/assets/themes/theme15.less
    +++ /dev/null
    @@ -1,1045 +0,0 @@
    -// DiVOC R2R
    -@import "../../../node_modules/bootstrap/less/variables";
    -
    -/*
    -The MIT License (MIT)
    -
    -Copyright (c) 2013 Thomas Park
    -
    -Permission is hereby granted, free of charge, to any person obtaining a copy
    -of this software and associated documentation files (the "Software"), to deal
    -in the Software without restriction, including without limitation the rights
    -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    -copies of the Software, and to permit persons to whom the Software is
    -furnished to do so, subject to the following conditions:
    -
    -The above copyright notice and this permission notice shall be included in
    -all copies or substantial portions of the Software.
    -
    -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    -THE SOFTWARE.
    -*/
    -
    -// Cyborg 3.2.0
    -// Variables
    -// --------------------------------------------------
    -
    -//== Colors
    -//
    -//## Gray and brand colors for use across Bootstrap.
    -
    -@gray-darker: #222; // #222
    -@gray-dark: #282828; // #333
    -@gray: #555; // #555
    -@gray-light: #888; // #999
    -@gray-lighter: #adafae; // #eee
    -
    -@brand-primary: #fe7900;
    -@brand-success: #00c466;
    -@brand-info: #00c466;
    -@brand-warning: #d10069;
    -@brand-danger: #d10069;
    -
    -@plum: #1f0229;
    -@dark-green: #00292d;
    -@blue: darken(#009951, 10%);
    -
    -.label.label-warning,
    -.progress-bar.progress-bar-warning {
    -  color:white;
    -}
    -
    -//== Scaffolding
    -//
    -//## Settings for some of the most global styles.
    -
    -//** Background color for ``.
    -@body-bg: @dark-green;
    -//** Global text color on ``.
    -@text-color: white;
    -
    -//** Global textual link color.
    -@link-color: @brand-primary;
    -//** Link hover color set via `darken()` function.
    -@link-hover-color: @link-color;
    -
    -//== Typography
    -//
    -//## Font, line-height, and color for body text, headings, and more.
    -
    -@font-family-serif: Georgia, "Times New Roman", Times, serif;
    -//** Default monospace fonts for ``, ``, and `
    `.
    -@font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace;
    -@font-family-base: Ubuntu, Roboto, sans-serif;
    -
    -@font-size-base: 14px;
    -@font-size-large: ceil((@font-size-base * 1.25)); // ~18px
    -@font-size-small: ceil((@font-size-base * 0.85)); // ~12px
    -
    -@font-size-h1: 34px;
    -@font-size-h2: 24px;
    -@font-size-h3: 20px;
    -@font-size-h4: 20px;
    -@font-size-h5: 20px;
    -@font-size-h6: 16px;
    -
    -//** Unit-less `line-height` for use in components like buttons.
    -@line-height-base: 1.428571429; // 20/14
    -//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
    -@line-height-computed: floor((@font-size-base * @line-height-base)); // ~20px
    -
    -//** By default, this inherits from the ``.
    -@headings-font-family: @font-family-base;
    -@headings-font-weight: 500;
    -@headings-line-height: 1.1;
    -@headings-color: @brand-info;
    -
    -//== Iconography
    -//
    -//## Specify custom location and filename of the included Glyphicons icon font.
    -//## Useful for those including Bootstrap via Bower.
    -
    -//** File name for all font files.
    -@icon-font-name: "glyphicons-halflings-regular";
    -//** Element ID within SVG icon file.
    -@icon-font-svg-id: "glyphicons_halflingsregular";
    -
    -//== Components
    -//
    -//## Define common padding and border radius sizes and more.
    -//## Values based on 14px text and 1.428 line-height (~20px to start).
    -
    -@padding-base-vertical: 8px;
    -@padding-base-horizontal: 12px;
    -
    -@padding-large-vertical: 14px;
    -@padding-large-horizontal: 16px;
    -
    -@padding-small-vertical: 5px;
    -@padding-small-horizontal: 10px;
    -
    -@padding-xs-vertical: 1px;
    -@padding-xs-horizontal: 5px;
    -
    -@line-height-large: 1.33;
    -@line-height-small: 1.5;
    -
    -@border-radius-base: 4px;
    -@border-radius-large: 6px;
    -@border-radius-small: 3px;
    -
    -//** Global color for active items (e.g., navs or dropdowns).
    -@component-active-color: #fff;
    -//** Global background color for active items (e.g., navs or dropdowns).
    -@component-active-bg: @plum;
    -
    -//** Width of the `border` for generating carets that indicator dropdowns.
    -@caret-width-base: 4px;
    -//** Carets increase slightly in size for larger components.
    -@caret-width-large: 5px;
    -
    -//== Tables
    -//
    -//## Customizes the `.table` component with basic values, each used across all table variations.
    -
    -//** Padding for ``s and ``s.
    -@table-cell-padding: 8px;
    -//** Padding for cells in `.table-condensed`.
    -@table-condensed-cell-padding: 5px;
    -
    -//** Default background color used for all tables.
    -@table-bg: darken(@gray-darker, 4%);
    -//** Background color used for `.table-striped`.
    -@table-bg-accent: darken(@table-bg, 6%);
    -//** Background color used for `.table-hover`.
    -@table-bg-hover: @gray-dark;
    -@table-bg-active: @table-bg-hover;
    -
    -//** Border color for table and cell borders.
    -@table-border-color: @gray-dark;
    -
    -//== Buttons
    -//
    -//## For each of Bootstrap's buttons, define text, background and border color.
    -
    -@btn-font-weight: normal;
    -
    -@btn-default-color: @dark-green;
    -@btn-default-bg: @brand-primary;
    -
    -@btn-default-border: @brand-primary;
    -
    -@btn-primary-color: @btn-default-color;
    -@btn-primary-bg: @btn-default-bg;
    -@btn-primary-border: @btn-default-border;
    -
    -@btn-success-color: @dark-green;
    -@btn-success-bg: @brand-success;
    -@btn-success-border: darken(@btn-default-bg, 10%);
    -
    -@btn-info-color: @dark-green;
    -@btn-info-bg: @brand-info;
    -@btn-info-border: @brand-info;
    -
    -@btn-warning-color: @dark-green;
    -@btn-warning-bg: @brand-warning;
    -@btn-warning-border: darken(@btn-default-bg, 10%);
    -
    -@btn-danger-color: white;
    -@btn-danger-bg: @brand-danger;
    -@btn-danger-border: @brand-danger;
    -
    -@btn-link-disabled-color: @gray-light;
    -
    -//== Forms
    -//
    -//##
    -
    -//** `` background color
    -@input-bg: @gray-darker;
    -//** `` background color
    -@input-bg-disabled: @gray-darker;
    -
    -//** Text color for ``s
    -@input-color: @text-color;
    -//** `` border color
    -@input-border: @gray-dark;
    -//** `` border radius
    -@input-border-radius: @border-radius-base;
    -//** Border color for inputs on focus
    -@input-border-focus: @brand-primary;
    -
    -//** Placeholder text color
    -@input-color-placeholder: @gray-light;
    -
    -//** Default `.form-control` height
    -@input-height-base: (@line-height-computed + (@padding-base-vertical * 2) + 2);
    -//** Large `.form-control` height
    -@input-height-large: (
    -  ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) +
    -    2
    -);
    -//** Small `.form-control` height
    -@input-height-small: (
    -  floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) +
    -    2
    -);
    -
    -@legend-color: @text-color;
    -@legend-border-color: @gray-dark;
    -
    -//** Background color for textual input addons
    -@input-group-addon-bg: @gray-lighter;
    -//** Border color for textual input addons
    -@input-group-addon-border-color: @input-border;
    -
    -//== Dropdowns
    -//
    -//## Dropdown menu container and contents.
    -
    -//** Background for the dropdown menu.
    -@dropdown-bg: @gray-darker;
    -//** Dropdown menu `border-color`.
    -@dropdown-border: rgba(255, 255, 255, 0.1);
    -//** Dropdown menu `border-color` **for IE8**.
    -@dropdown-fallback-border: #444;
    -//** Divider color for between dropdown items.
    -@dropdown-divider-bg: rgba(255, 255, 255, 0.1);
    -
    -//** Dropdown link text color.
    -@dropdown-link-color: #fff;
    -//** Hover color for dropdown links.
    -@dropdown-link-hover-color: #fff;
    -//** Hover background for dropdown links.
    -@dropdown-link-hover-bg: @dropdown-link-active-bg;
    -
    -//** Active dropdown menu item text color.
    -@dropdown-link-active-color: #fff;
    -//** Active dropdown menu item background color.
    -@dropdown-link-active-bg: @component-active-bg;
    -
    -//** Disabled dropdown menu item background color.
    -@dropdown-link-disabled-color: @text-muted;
    -
    -//** Text color for headers within dropdown menus.
    -@dropdown-header-color: @text-muted;
    -
    -//** Deprecated `@dropdown-caret-color` as of v3.1.0
    -@dropdown-caret-color: #000;
    -
    -//-- Z-index master list
    -//
    -// Warning: Avoid customizing these values. They're used for a bird's eye view
    -// of components dependent on the z-axis and are designed to all work together.
    -//
    -// Note: These variables are not generated into the Customizer.
    -
    -@zindex-navbar: 1000;
    -@zindex-dropdown: 1000;
    -@zindex-popover: 1060;
    -@zindex-tooltip: 1070;
    -@zindex-navbar-fixed: 1030;
    -@zindex-modal-background: 1040;
    -@zindex-modal: 1050;
    -
    -//== Media queries breakpoints
    -//
    -//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
    -
    -// Extra small screen / phone
    -//** Deprecated `@screen-xs` as of v3.0.1
    -@screen-xs: 480px;
    -//** Deprecated `@screen-xs-min` as of v3.2.0
    -@screen-xs-min: @screen-xs;
    -//** Deprecated `@screen-phone` as of v3.0.1
    -@screen-phone: @screen-xs-min;
    -
    -// Small screen / tablet
    -//** Deprecated `@screen-sm` as of v3.0.1
    -@screen-sm: 768px;
    -@screen-sm-min: @screen-sm;
    -//** Deprecated `@screen-tablet` as of v3.0.1
    -@screen-tablet: @screen-sm-min;
    -
    -// Medium screen / desktop
    -//** Deprecated `@screen-md` as of v3.0.1
    -@screen-md: 992px;
    -@screen-md-min: @screen-md;
    -//** Deprecated `@screen-desktop` as of v3.0.1
    -@screen-desktop: @screen-md-min;
    -
    -// Large screen / wide desktop
    -//** Deprecated `@screen-lg` as of v3.0.1
    -@screen-lg: 1200px;
    -@screen-lg-min: @screen-lg;
    -//** Deprecated `@screen-lg-desktop` as of v3.0.1
    -@screen-lg-desktop: @screen-lg-min;
    -
    -// So media queries don't overlap when required, provide a maximum
    -@screen-xs-max: (@screen-sm-min - 1);
    -@screen-sm-max: (@screen-md-min - 1);
    -@screen-md-max: (@screen-lg-min - 1);
    -
    -//== Grid system
    -//
    -//## Define your custom responsive grid.
    -
    -//** Number of columns in the grid.
    -@grid-columns: 12;
    -//** Padding between columns. Gets divided in half for the left and right.
    -@grid-gutter-width: 30px;
    -// Navbar collapse
    -//** Point at which the navbar becomes uncollapsed.
    -@grid-float-breakpoint: @screen-sm-min;
    -//** Point at which the navbar begins collapsing.
    -@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
    -
    -//== Container sizes
    -//
    -//## Define the maximum width of `.container` for different screen sizes.
    -
    -// Small screen / tablet
    -@container-tablet: ((720px + @grid-gutter-width));
    -//** For `@screen-sm-min` and up.
    -@container-sm: @container-tablet;
    -
    -// Medium screen / desktop
    -@container-desktop: ((940px + @grid-gutter-width));
    -//** For `@screen-md-min` and up.
    -@container-md: @container-desktop;
    -
    -// Large screen / wide desktop
    -@container-large-desktop: ((1140px + @grid-gutter-width));
    -//** For `@screen-lg-min` and up.
    -@container-lg: @container-large-desktop;
    -
    -//== Navbar
    -//
    -//##
    -
    -// Basics of a navbar
    -@navbar-height: 50px;
    -@navbar-margin-bottom: @line-height-computed;
    -@navbar-border-radius: @border-radius-base;
    -@navbar-padding-horizontal: floor((@grid-gutter-width / 2));
    -@navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2);
    -@navbar-collapse-max-height: 340px;
    -
    -@navbar-default-color: @text-color;
    -@navbar-default-bg: @plum;
    -@navbar-default-border: @gray-dark;
    -
    -// Navbar links
    -@navbar-default-link-color: @text-color;
    -@navbar-default-link-hover-color: #fff;
    -@navbar-default-link-hover-bg: transparent;
    -@navbar-default-link-active-color: #fff;
    -@navbar-default-link-active-bg: transparent;
    -@navbar-default-link-disabled-color: @gray-light;
    -@navbar-default-link-disabled-bg: transparent;
    -
    -// Navbar brand label
    -@navbar-default-brand-color: #fff;
    -@navbar-default-brand-hover-color: #fff;
    -@navbar-default-brand-hover-bg: transparent;
    -
    -// Navbar toggle
    -@navbar-default-toggle-hover-bg: @gray-dark;
    -@navbar-default-toggle-icon-bar-bg: #ccc;
    -@navbar-default-toggle-border-color: @gray-dark;
    -
    -// Inverted navbar
    -// Reset inverted navbar basics
    -@navbar-inverse-color: @gray-light;
    -@navbar-inverse-bg: @gray-darker;
    -@navbar-inverse-border: darken(@navbar-inverse-bg, 10%);
    -
    -// Inverted navbar links
    -@navbar-inverse-link-color: @gray-light;
    -@navbar-inverse-link-hover-color: #fff;
    -@navbar-inverse-link-hover-bg: transparent;
    -@navbar-inverse-link-active-color: @navbar-inverse-link-hover-color;
    -@navbar-inverse-link-active-bg: transparent;
    -@navbar-inverse-link-disabled-color: #aaa;
    -@navbar-inverse-link-disabled-bg: transparent;
    -
    -// Inverted navbar brand label
    -@navbar-inverse-brand-color: #fff;
    -@navbar-inverse-brand-hover-color: #fff;
    -@navbar-inverse-brand-hover-bg: transparent;
    -
    -// Inverted navbar toggle
    -@navbar-inverse-toggle-hover-bg: #333;
    -@navbar-inverse-toggle-icon-bar-bg: #fff;
    -@navbar-inverse-toggle-border-color: #333;
    -
    -//== Navs
    -//
    -//##
    -
    -//=== Shared nav styles
    -@nav-link-padding: 10px 15px;
    -@nav-link-hover-bg: @gray-darker;
    -
    -@nav-disabled-link-color: @gray-light;
    -@nav-disabled-link-hover-color: @gray-light;
    -
    -@nav-open-link-hover-color: @gray-darker;
    -
    -//== Tabs
    -@nav-tabs-border-color: @gray-dark;
    -
    -@nav-tabs-link-hover-border-color: transparent;
    -
    -@nav-tabs-active-link-hover-bg: @plum;
    -@nav-tabs-active-link-hover-color: #fff;
    -@nav-tabs-active-link-hover-border-color: @gray-dark;
    -
    -@nav-tabs-justified-link-border-color: #ddd;
    -@nav-tabs-justified-active-link-border-color: @body-bg;
    -
    -//== Pills
    -@nav-pills-border-radius: @border-radius-base;
    -@nav-pills-active-link-hover-bg: @component-active-bg;
    -@nav-pills-active-link-hover-color: @component-active-color;
    -
    -//== Pagination
    -//
    -//##
    -
    -@pagination-color: #fff;
    -@pagination-bg: @gray-darker;
    -@pagination-border: @gray-dark;
    -
    -@pagination-hover-color: #fff;
    -@pagination-hover-bg: @component-active-bg;
    -@pagination-hover-border: transparent;
    -
    -@pagination-active-color: #fff;
    -@pagination-active-bg: @brand-primary;
    -@pagination-active-border: transparent;
    -
    -@pagination-disabled-color: @gray-light;
    -@pagination-disabled-bg: @gray-darker;
    -@pagination-disabled-border: @gray-dark;
    -
    -//== Pager
    -//
    -//##
    -
    -@pager-bg: @pagination-bg;
    -@pager-border: @pagination-border;
    -@pager-border-radius: 15px;
    -
    -@pager-hover-bg: @pagination-hover-bg;
    -
    -@pager-active-bg: @pagination-active-bg;
    -@pager-active-color: @pagination-active-color;
    -
    -@pager-disabled-color: @gray-light;
    -
    -//== Jumbotron
    -//
    -//##
    -
    -@jumbotron-padding: 30px;
    -@jumbotron-color: inherit;
    -@jumbotron-bg: darken(@gray-darker, 5%);
    -@jumbotron-heading-color: inherit;
    -@jumbotron-font-size: ceil((@font-size-base * 1.5));
    -
    -//== Form states and alerts
    -//
    -//## Define colors for form feedback states and, by default, alerts.
    -
    -@state-success-text: #fff;
    -@state-success-bg: @brand-success;
    -@state-success-border: darken(@state-success-bg, 5%);
    -
    -@state-info-text: #fff;
    -@state-info-bg: @brand-info;
    -@state-info-border: darken(@state-info-bg, 7%);
    -
    -@state-warning-text: #000;
    -@state-warning-bg: @brand-warning;
    -@state-warning-border: darken(@state-warning-bg, 3%);
    -
    -@state-danger-text: #fff;
    -@state-danger-bg: @brand-danger;
    -@state-danger-border: darken(@state-danger-bg, 3%);
    -
    -//== Tooltips
    -//
    -//##
    -
    -//** Tooltip max width
    -@tooltip-max-width: 200px;
    -//** Tooltip text color
    -@tooltip-color: #fff;
    -//** Tooltip background color
    -@tooltip-bg: rgba(0, 0, 0, 0.9);
    -@tooltip-opacity: 0.9;
    -
    -//** Tooltip arrow width
    -@tooltip-arrow-width: 5px;
    -//** Tooltip arrow color
    -@tooltip-arrow-color: @tooltip-bg;
    -
    -//== Popovers
    -//
    -//##
    -
    -//** Popover body background color
    -@popover-bg: lighten(@body-bg, 10%);
    -//** Popover maximum width
    -@popover-max-width: 276px;
    -//** Popover border color
    -@popover-border-color: rgba(0, 0, 0, 0.2);
    -//** Popover fallback border color
    -@popover-fallback-border-color: #999;
    -
    -//** Popover title background color
    -@popover-title-bg: darken(@popover-bg, 3%);
    -
    -//** Popover arrow width
    -@popover-arrow-width: 10px;
    -//** Popover arrow color
    -@popover-arrow-color: @popover-bg;
    -
    -//** Popover outer arrow width
    -@popover-arrow-outer-width: (@popover-arrow-width + 1);
    -//** Popover outer arrow color
    -@popover-arrow-outer-color: fadein(@popover-border-color, 5%);
    -//** Popover outer arrow fallback color
    -@popover-arrow-outer-fallback-color: darken(
    -  @popover-fallback-border-color,
    -  20%
    -);
    -
    -//== Labels
    -//
    -//##
    -
    -//** Default label background color
    -@label-default-bg: @plum;
    -//** Primary label background color
    -@label-primary-bg: @brand-primary;
    -//** Success label background color
    -@label-success-bg: @brand-success;
    -//** Info label background color
    -@label-info-bg: @brand-info;
    -//** Warning label background color
    -@label-warning-bg: @blue;
    -//** Danger label background color
    -@label-danger-bg: @brand-danger;
    -
    -//** Default label text color
    -@label-color: #fff;
    -//** Default text color of a linked label
    -@label-link-hover-color: #fff;
    -
    -//== Modals
    -//
    -//##
    -
    -//** Padding applied to the modal body
    -@modal-inner-padding: 20px;
    -
    -//** Padding applied to the modal title
    -@modal-title-padding: 15px;
    -//** Modal title line-height
    -@modal-title-line-height: @line-height-base;
    -
    -//** Background color of modal content area
    -@modal-content-bg: lighten(@body-bg, 10%);
    -//** Modal content border color
    -@modal-content-border-color: rgba(0, 0, 0, 0.2);
    -//** Modal content border color **for IE8**
    -@modal-content-fallback-border-color: #999;
    -
    -//** Modal backdrop background color
    -@modal-backdrop-bg: #000;
    -//** Modal backdrop opacity
    -@modal-backdrop-opacity: 0.5;
    -//** Modal header border color
    -@modal-header-border-color: @gray-dark;
    -//** Modal footer border color
    -@modal-footer-border-color: @modal-header-border-color;
    -
    -@modal-lg: 900px;
    -@modal-md: 600px;
    -@modal-sm: 300px;
    -
    -//== Alerts
    -//
    -//## Define alert colors, border radius, and padding.
    -
    -@alert-padding: 15px;
    -@alert-border-radius: @border-radius-base;
    -@alert-link-font-weight: bold;
    -
    -@alert-success-bg: @state-success-bg;
    -@alert-success-text: @dark-green;
    -@alert-success-border: @state-success-border;
    -
    -@alert-info-bg: @state-info-bg;
    -@alert-info-text: @dark-green;
    -@alert-info-border: @state-info-border;
    -
    -@alert-warning-bg: @state-warning-bg;
    -@alert-warning-text: @state-warning-text;
    -@alert-warning-border: @state-warning-border;
    -
    -@alert-danger-bg: @state-danger-bg;
    -@alert-danger-text: white;
    -@alert-danger-border: @state-danger-border;
    -
    -//== Progress bars
    -//
    -//##
    -
    -//** Background color of the whole progress component
    -@progress-bg: @gray-darker;
    -//** Progress bar text color
    -@progress-bar-color: #fff;
    -
    -//** Default progress bar color
    -@progress-bar-bg: @brand-primary;
    -//** Success progress bar color
    -@progress-bar-success-bg: @brand-success;
    -//** Warning progress bar color
    -@progress-bar-warning-bg: @brand-warning;
    -//** Danger progress bar color
    -@progress-bar-danger-bg: @brand-danger;
    -//** Info progress bar color
    -@progress-bar-info-bg: @brand-info;
    -
    -//== List group
    -//
    -//##
    -
    -//** Background color on `.list-group-item`
    -@list-group-bg: @plum;
    -//** `.list-group-item` border color
    -@list-group-border: @gray-dark;
    -//** List group border radius
    -@list-group-border-radius: @border-radius-base;
    -
    -//** Background color of single list items on hover
    -@list-group-hover-bg: lighten(@list-group-bg, 15%);
    -//** Text color of active list items
    -@list-group-active-color: @component-active-color;
    -//** Background color of active list items
    -@list-group-active-bg: @component-active-bg;
    -//** Border color of active list elements
    -@list-group-active-border: @list-group-active-bg;
    -//** Text color for content within active list items
    -@list-group-active-text-color: lighten(@list-group-active-bg, 40%);
    -
    -//** Text color of disabled list items
    -@list-group-disabled-color: @gray-light;
    -//** Background color of disabled list items
    -@list-group-disabled-bg: @gray-lighter;
    -//** Text color for content within disabled list items
    -@list-group-disabled-text-color: @list-group-disabled-color;
    -
    -@list-group-link-color: @text-color;
    -@list-group-link-hover-color: @list-group-link-color;
    -@list-group-link-heading-color: #fff;
    -
    -//== Panels
    -//
    -//##
    -
    -@panel-bg: @plum;
    -@panel-body-padding: 15px;
    -@panel-heading-padding: 10px 15px;
    -@panel-footer-padding: @panel-heading-padding;
    -@panel-border-radius: @border-radius-base;
    -
    -//** Border color for elements within panels
    -@panel-inner-border: lighten(@plum, 3%);
    -
    -@panel-default-text: @text-color;
    -@panel-default-border: @panel-inner-border;
    -@panel-default-heading-bg: lighten(@plum, 3%);
    -
    -@panel-footer-bg: @panel-default-heading-bg;
    -
    -@panel-primary-text: #fff;
    -@panel-primary-border: @brand-primary;
    -@panel-primary-heading-bg: @brand-primary;
    -
    -@panel-success-text: @state-success-text;
    -@panel-success-border: @state-success-border;
    -@panel-success-heading-bg: @state-success-bg;
    -
    -@panel-info-text: @state-info-text;
    -@panel-info-border: @panel-inner-border;
    -@panel-info-heading-bg: lighten(@plum, 3%);
    -
    -@panel-warning-text: white;
    -@panel-warning-border: @blue;
    -@panel-warning-heading-bg: @blue;
    -
    -@panel-danger-text: @state-danger-text;
    -@panel-danger-border: @state-danger-border;
    -@panel-danger-heading-bg: @state-danger-bg;
    -
    -//== Thumbnails
    -//
    -//##
    -
    -//** Padding around the thumbnail image
    -@thumbnail-padding: 4px;
    -//** Thumbnail background color
    -@thumbnail-bg: @gray-dark;
    -//** Thumbnail border color
    -@thumbnail-border: @gray-dark;
    -//** Thumbnail border radius
    -@thumbnail-border-radius: @border-radius-base;
    -
    -//** Custom text color for thumbnail captions
    -@thumbnail-caption-color: @text-color;
    -//** Padding around the thumbnail caption
    -@thumbnail-caption-padding: 9px;
    -
    -//== Wells
    -//
    -//##
    -
    -@well-bg: darken(@gray-darker, 5%);
    -@well-border: darken(@well-bg, 7%);
    -
    -//== Badges
    -//
    -//##
    -
    -@badge-color: @dark-green;
    -//** Linked badge text color on hover
    -@badge-link-hover-color: @dark-green;
    -@badge-bg: @brand-primary;
    -
    -//** Badge text color in active nav link
    -@badge-active-color: @brand-primary;
    -//** Badge background color in active nav link
    -@badge-active-bg: #fff;
    -
    -@badge-font-weight: bold;
    -@badge-line-height: 1;
    -@badge-border-radius: 10px;
    -
    -//== Breadcrumbs
    -//
    -//##
    -
    -@breadcrumb-padding-vertical: 8px;
    -@breadcrumb-padding-horizontal: 15px;
    -//** Breadcrumb background color
    -@breadcrumb-bg: @gray-darker;
    -//** Breadcrumb text color
    -@breadcrumb-color: #fff;
    -//** Text color of current page in the breadcrumb
    -@breadcrumb-active-color: @text-color;
    -//** Textual separator for between breadcrumb elements
    -@breadcrumb-separator: "/";
    -
    -//== Carousel
    -//
    -//##
    -
    -@carousel-text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
    -
    -@carousel-control-color: #fff;
    -@carousel-control-width: 15%;
    -@carousel-control-opacity: 0.5;
    -@carousel-control-font-size: 20px;
    -
    -@carousel-indicator-active-bg: #fff;
    -@carousel-indicator-border-color: #fff;
    -
    -@carousel-caption-color: #fff;
    -
    -//== Close
    -//
    -//##
    -
    -@close-font-weight: bold;
    -@close-color: #000;
    -@close-text-shadow: 0 1px 0 #fff;
    -
    -//== Code
    -//
    -//##
    -
    -@code-color: #c7254e;
    -@code-bg: #f9f2f4;
    -
    -@kbd-color: #fff;
    -@kbd-bg: #333;
    -
    -@pre-bg: #f5f5f5;
    -@pre-color: @gray-dark;
    -@pre-border-color: #ccc;
    -@pre-scrollable-max-height: 340px;
    -
    -//== Type
    -//
    -//##
    -
    -//** Horizontal offset for forms and lists.
    -@component-offset-horizontal: 180px;
    -//** Text muted color
    -@text-muted: @gray-light;
    -//** Abbreviations and acronyms border color
    -@abbr-border-color: @gray-light;
    -//** Headings small color
    -@headings-small-color: @gray-light;
    -//** Blockquote small color
    -@blockquote-small-color: @gray;
    -//** Blockquote font size
    -@blockquote-font-size: (@font-size-base * 1.25);
    -//** Blockquote border color
    -@blockquote-border-color: @gray-dark;
    -//** Page header border color
    -@page-header-border-color: @gray-dark;
    -//** Width of horizontal description list titles
    -@dl-horizontal-offset: @component-offset-horizontal;
    -//** Horizontal line color.
    -@hr-border: @gray-dark;
    -
    -@import "base";
    -
    -.messages .text-danger {
    -  color: @brand-danger;
    -}
    -
    -.messages .text-info {
    -  color: #fff;
    -}
    -
    -.messages .caret {
    -  color: #fff;
    -}
    -
    -// Cyborg 3.2.0
    -// Bootswatch
    -// -----------------------------------------------------
    -
    -// Navbar =====================================================================
    -
    -// Buttons ====================================================================
    -
    -// Typography =================================================================
    -
    -.text-primary,
    -.text-primary:hover,
    -a.text-primary,
    -a.text-primary:hover {
    -  color: @brand-primary;
    -}
    -
    -.text-success,
    -.text-success:hover,
    -a.text-success,
    -a.text-success:hover {
    -  color: @brand-success;
    -}
    -
    -.text-danger,
    -.text-danger:hover,
    -a.text-danger,
    -a.text-danger:hover {
    -  color: @brand-danger;
    -}
    -
    -.text-warning,
    -.text-warning:hover,
    -a.text-warning,
    -a.text-warning:hover {
    -  color: @brand-warning;
    -}
    -
    -.text-info,
    -.text-info:hover,
    -a.text-info,
    -a.text-info:hover {
    -  color: @brand-info;
    -}
    -
    -// Tables =====================================================================
    -
    -table,
    -.table {
    -  color: #fff;
    -
    -  a:not(.btn) {
    -    color: #fff;
    -    text-decoration: underline;
    -  }
    -
    -  .text-muted {
    -    color: @text-muted;
    -  }
    -}
    -
    -.table-responsive > .table {
    -  background-color: @table-bg;
    -}
    -
    -// Forms ======================================================================
    -
    -.has-warning {
    -  .help-block,
    -  .control-label,
    -  .form-control-feedback {
    -    color: @brand-warning;
    -  }
    -
    -  .form-control,
    -  .form-control:focus,
    -  .input-group-addon {
    -    border-color: @brand-warning;
    -  }
    -}
    -
    -.has-error {
    -  .help-block,
    -  .control-label,
    -  .form-control-feedback {
    -    color: @brand-danger;
    -  }
    -
    -  .form-control,
    -  .form-control:focus,
    -  .input-group-addon {
    -    border-color: @brand-danger;
    -  }
    -}
    -
    -.has-success {
    -  .help-block,
    -  .control-label,
    -  .form-control-feedback {
    -    color: @brand-success;
    -  }
    -
    -  .form-control,
    -  .form-control:focus,
    -  .input-group-addon {
    -    border-color: @brand-success;
    -  }
    -}
    -
    -.input-group-addon {
    -  background-color: @btn-default-bg;
    -}
    -
    -// Navs =======================================================================
    -
    -.nav-tabs,
    -.nav-pills,
    -.breadcrumb,
    -.pager {
    -  a {
    -    color: #fff;
    -  }
    -}
    -
    -// Indicators =================================================================
    -
    -.alert {
    -  .alert-link,
    -  a {
    -    color: white;
    -    text-decoration: underline;
    -  }
    -
    -  .close {
    -    text-decoration: none;
    -  }
    -}
    -
    -.close {
    -  color: #fff;
    -  text-decoration: none;
    -  opacity: 0.4;
    -
    -  &:hover,
    -  &:focus {
    -    color: #fff;
    -    opacity: 1;
    -  }
    -}
    -
    -// Progress bars ==============================================================
    -
    -// Containers =================================================================
    -
    -a.thumbnail:hover,
    -a.thumbnail:focus,
    -a.thumbnail.active {
    -  border-color: @thumbnail-border;
    -}
    -
    -.jumbotron {
    -  h1,
    -  h2,
    -  h3,
    -  h4,
    -  h5,
    -  h6 {
    -    color: @brand-info;
    -  }
    -}
    -
    -// code tag
    -code {
    -  background-color: @input-bg;
    -  color: @input-color;
    -}
    diff --git a/resources/assets/themes/theme2.less b/resources/assets/themes/theme2.less
    deleted file mode 100644
    index 26acc1bb..00000000
    --- a/resources/assets/themes/theme2.less
    +++ /dev/null
    @@ -1,28 +0,0 @@
    -// cccamp15
    -@import "../../../node_modules/bootstrap/less/variables";
    -
    -@brand-primary:         #758499;
    -@brand-success:         #7b9c41;
    -@brand-info:            #9c7357;
    -@brand-warning:         #e3a14d;
    -@brand-danger:          #7f528b;
    -
    -@link-color:            #58585a;
    -
    -@state-success-text:             #638232;
    -@state-success-bg:               lighten(@brand-success,50%);
    -@state-success-border:           @brand-success;
    -
    -@state-info-text:                #826045;
    -@state-info-bg:                  lighten(@brand-info,50%);
    -@state-info-border:              @brand-info;
    -
    -@state-warning-text:             #bc8640;
    -@state-warning-bg:               lighten(@brand-warning,50%);
    -@state-warning-border:           @brand-warning;
    -
    -@state-danger-text:              #694374;
    -@state-danger-bg:                lighten(@brand-danger,50%);
    -@state-danger-border:            @brand-danger;
    -
    -@import "base.less";
    diff --git a/resources/assets/themes/theme2.scss b/resources/assets/themes/theme2.scss
    new file mode 100644
    index 00000000..d09821a3
    --- /dev/null
    +++ b/resources/assets/themes/theme2.scss
    @@ -0,0 +1,39 @@
    +// cccamp15
    +@import "light";
    +
    +$brand-primary: #758499;
    +$primary:       #758499;
    +$brand-success: #7b9c41;
    +$success: #7b9c41;
    +$brand-info:    #9c7357;
    +$info:    #9c7357;
    +$brand-warning: #e3a14d;
    +$warning: #e3a14d;
    +$brand-danger:  #7f528b;
    +$danger:  #7f528b;
    +
    +$link-color:            #58585a;
    +
    +$state-success-text:             #638232;
    +$state-success-bg:               lighten($brand-success,50%);
    +$state-success-border:           $brand-success;
    +
    +$state-info-text:                #826045;
    +$state-info-bg:                  lighten($brand-info,50%);
    +$state-info-border:              $brand-info;
    +
    +$state-warning-text:             #bc8640;
    +$state-warning-bg:               lighten($brand-warning,50%);
    +$state-warning-border:           $brand-warning;
    +
    +$state-danger-text:              #694374;
    +$state-danger-bg:                lighten($brand-danger,50%);
    +$state-danger-border:            $brand-danger;
    +
    +@import "base.scss";
    +
    +h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
    +    &.bg-danger {
    +        color: #fff;
    +    }
    +}
    diff --git a/resources/assets/themes/theme3.less b/resources/assets/themes/theme3.less
    deleted file mode 100644
    index 0bb53e09..00000000
    --- a/resources/assets/themes/theme3.less
    +++ /dev/null
    @@ -1,56 +0,0 @@
    -// 32c3 (2015)
    -@import "../../../node_modules/bootstrap/less/variables";
    -
    -@brand-primary:         #f19224;
    -@brand-success:         #39AB50;
    -@brand-info:            #6618F9;
    -@brand-warning:         #DAD216;
    -@brand-danger:          #DA1639;
    -
    -@state-success-text:             @brand-success;
    -@state-success-bg:               lighten(@brand-success,40%);
    -@state-success-border:           @brand-success;
    -
    -@state-info-text:                @brand-info;
    -@state-info-bg:                  lighten(@brand-info,40%);
    -@state-info-border:              @brand-info;
    -
    -@state-warning-text:             @brand-warning;
    -@state-warning-bg:               lighten(@brand-warning,40%);
    -@state-warning-border:           @brand-warning;
    -
    -@state-danger-text:              @brand-danger;
    -@state-danger-bg:                lighten(@brand-danger,40%);
    -@state-danger-border:            @brand-danger;
    -
    -@navbar-default-color:  #fff;
    -@navbar-default-bg:     #000;
    -@navbar-default-border: #000;
    -
    -@navbar-default-link-color:         #fff;
    -@navbar-default-link-hover-color:   #ddd;
    -@navbar-default-link-hover-bg:      #222;
    -
    -@navbar-default-link-active-color:  @brand-primary;
    -@navbar-default-link-active-bg:     #000;
    -@navbar-default-link-disabled-color:#777;
    -@navbar-default-link-disabled-bg:   #000;
    -
    -@navbar-default-brand-color:        #fff;
    -@navbar-default-brand-hover-color:  @brand-primary;
    -@navbar-default-brand-hover-bg:     #000;
    -
    -.navbar {
    -  .bg-info {
    -    background-color: darken(@brand-info, 30%);
    -  }
    -  .bg-danger {
    -    background-color: darken(@brand-danger, 30%);
    -  }
    -}
    -
    -#shifts td a {
    -  color: #000;
    -}
    -
    -@import "base.less";
    diff --git a/resources/assets/themes/theme3.scss b/resources/assets/themes/theme3.scss
    new file mode 100644
    index 00000000..ab0471f7
    --- /dev/null
    +++ b/resources/assets/themes/theme3.scss
    @@ -0,0 +1,75 @@
    +// 32c3 (2015)
    +@import "light";
    +
    +$brand-primary:         #f19224;
    +$primary:         #f19224;
    +$brand-success:         #39AB50;
    +$success:         #39AB50;
    +$brand-info:            #6618F9;
    +$info:            #6618F9;
    +$brand-warning:         #DAD216;
    +$warning:         #DAD216;
    +$brand-danger:          #DA1639;
    +$danger:          #DA1639;
    +
    +$state-success-text:             $brand-success;
    +$state-success-bg:               lighten($brand-success,40%);
    +$state-success-border:           $brand-success;
    +
    +$state-info-text:                $brand-info;
    +$state-info-bg:                  lighten($brand-info,40%);
    +$state-info-border:              $brand-info;
    +
    +$state-warning-text:             $brand-warning;
    +$state-warning-bg:               lighten($brand-warning,40%);
    +$state-warning-border:           $brand-warning;
    +
    +$state-danger-text:              $brand-danger;
    +$state-danger-bg:                lighten($brand-danger,40%);
    +$state-danger-border:            $brand-danger;
    +
    +$navbar-default-color:  #fff;
    +$navbar-default-bg:     #000;
    +$navbar-default-border: #000;
    +
    +$navbar-default-link-color:         #fff;
    +$navbar-default-link-hover-color:   #ddd;
    +$navbar-default-link-hover-bg:      #222;
    +
    +$navbar-default-link-active-color:  $brand-primary;
    +$navbar-default-link-active-bg:     #000;
    +$navbar-default-link-disabled-color:#777;
    +$navbar-default-link-disabled-bg:   #000;
    +
    +$navbar-default-brand-color:        #fff;
    +$navbar-default-brand-hover-color:  $brand-primary;
    +$navbar-default-brand-hover-bg:     #000;
    +
    +.navbar {
    +  .bg-info {
    +    background-color: darken($brand-info, 30%);
    +  }
    +  .bg-danger {
    +    background-color: darken($brand-danger, 30%);
    +  }
    +}
    +
    +#shifts td a {
    +  color: #000;
    +}
    +
    +.card.bg-info .card-header a {
    +  color: lighten($brand-info, 50%);
    +
    +  &:hover {
    +    color: lighten($brand-info, 50%);
    +  }
    +}
    +
    +@import "base.scss";
    +
    +h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
    +    &.bg-info {
    +        color: #fff;
    +    }
    +}
    diff --git a/resources/assets/themes/theme4.less b/resources/assets/themes/theme4.less
    deleted file mode 100644
    index 36b20c4f..00000000
    --- a/resources/assets/themes/theme4.less
    +++ /dev/null
    @@ -1,112 +0,0 @@
    -// 33c3 (2016)
    -@import "cyborg_variables.less";
    -
    -// Variables
    -// --------------------------------------------------
    -
    -//== changed Colors
    -
    -@gray-dark:              #282828;   // #333
    -@gray-light:             #888;   // #999
    -@gray-lighter:           #ADAFAE; // #eee
    -
    -@brand-primary:         rgb(0, 156, 139);
    -@brand-success:         rgb(141, 193, 35);
    -@brand-info:            rgb(70, 71, 73);
    -@brand-warning:         rgb(255, 244, 95);
    -@brand-danger:          rgb(277, 38, 60);
    -
    -
    -//== changed Scaffolding
    -
    -@body-bg:               #1d1d1b;
    -
    -
    -//== changed Buttons
    -
    -@btn-default-color:              #fff;
    -@btn-default-bg:                 lighten(@gray-dark, 10%);
    -
    -@btn-primary-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-success-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-info-border:                darken(@btn-default-bg, 10%);
    -
    -@btn-warning-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-danger-border:              darken(@btn-default-bg, 10%);
    -
    -
    -//== changed Forms
    -
    -@input-bg:                       @gray-darker;
    -
    -@input-bg-disabled:              @gray-lighter;
    -
    -@input-group-addon-bg:           @gray-lighter;
    -
    -
    -//== Pagination
    -
    -@pagination-hover-color:               #fff;
    -
    -@pagination-active-color:              #fff;
    -
    -
    -//== changed Form states and alerts
    -
    -@state-success-text:             #fff;
    -@state-success-bg:               @brand-success;
    -@state-success-border:           darken(@state-success-bg, 5%);
    -
    -@state-info-text:                #fff;
    -@state-info-bg:                  @brand-info;
    -@state-info-border:              darken(@state-info-bg, 7%);
    -
    -@state-warning-text:             darken(@brand-warning, 40%);
    -@state-warning-bg:               @brand-warning;
    -@state-warning-border:           darken(@state-warning-bg, 3%);
    -
    -@state-danger-text:              #fff;
    -@state-danger-bg:                @brand-danger;
    -@state-danger-border:            darken(@state-danger-bg, 3%);
    -
    -
    -//== changed Badges
    -
    -@badge-color:                 #fff;
    -
    -@badge-link-hover-color:      #fff;
    -
    -
    -//== changed Type
    -
    -@headings-small-color:        @gray-light;
    -
    -
    -// Bootswatch
    -// -----------------------------------------------------
    -@import "cyborg_styles.less";
    -
    -// added Forms ======================================================================
    -
    -.input-group-addon {
    -  background-color: @btn-default-bg;
    -}
    -
    -
    -// added Containers =================================================================
    -
    -.label-warning, .label-success, .progress-bar-warning, .progress-bar-success,
    -.panel-warning .panel-heading, .panel-warning .panel-heading a,
    -.panel-success .panel-heading, .panel-success .panel-heading a {
    -  color: @gray-darker;
    -}
    -
    -
    -// different code tag
    -code {
    -  background-color: @state-info-bg;
    -  color: @state-info-text;
    -}
    diff --git a/resources/assets/themes/theme4.scss b/resources/assets/themes/theme4.scss
    new file mode 100644
    index 00000000..ed1b9297
    --- /dev/null
    +++ b/resources/assets/themes/theme4.scss
    @@ -0,0 +1,124 @@
    +// 33c3 (2016)
    +@import "dark";
    +
    +// Variables
    +
    +//== changed Colors
    +
    +$gray-dark:    #282828;
    +$gray-darker:  #222;
    +$gray-light:   #888;
    +$gray-lighter: #ADAFAE;
    +
    +$brand-primary: rgb(0, 156, 139);
    +$primary: rgb(0, 156, 139);
    +$secondary: #424242;
    +$brand-success: rgb(141, 193, 35);
    +$success: rgb(141, 193, 35);
    +$brand-info:    rgb(70, 71, 73);
    +$info:    rgb(70, 71, 73);
    +$brand-warning: rgb(255, 244, 95);
    +$warning: rgb(255, 244, 95);
    +$brand-danger:  rgb(277, 38, 60);
    +$danger:  rgb(277, 38, 60);
    +
    +$text-muted: lighten($gray-light, 25%);
    +
    +//== changed Scaffolding
    +
    +$body-bg:  #1d1d1b;
    +$alert-bg-scale: 0%;
    +
    +
    +//== changed Buttons
    +
    +$btn-color:                      #fff;
    +$btn-default-bg:                 lighten($gray-dark, 10%);
    +
    +$btn-primary-border:             darken($btn-default-bg, 10%);
    +
    +$btn-success-border:             darken($btn-default-bg, 10%);
    +
    +$btn-info-border:                darken($btn-default-bg, 10%);
    +
    +$btn-warning-border:             darken($btn-default-bg, 10%);
    +
    +$btn-danger-border:              darken($btn-default-bg, 10%);
    +
    +
    +//== changed Forms
    +
    +$input-bg:                       $gray-darker;
    +
    +$input-bg-disabled:              $gray-lighter;
    +
    +$input-group-addon-bg:           $gray-lighter;
    +
    +
    +//== Pagination
    +
    +$pagination-hover-color:               #fff;
    +
    +$pagination-active-color:              #fff;
    +
    +
    +//== changed Form states and alerts
    +
    +$state-success-text:             #fff;
    +$state-success-bg:               $brand-success;
    +$state-success-border:           darken($state-success-bg, 5%);
    +
    +$state-info-text:                #fff;
    +$state-info-bg:                  $brand-info;
    +$state-info-border:              darken($state-info-bg, 7%);
    +
    +$state-warning-text:             darken($brand-warning, 40%);
    +$state-warning-bg:               $brand-warning;
    +$state-warning-border:           darken($state-warning-bg, 3%);
    +
    +$state-danger-text:              #fff;
    +$state-danger-bg:                $brand-danger;
    +$state-danger-border:            darken($state-danger-bg, 3%);
    +
    +
    +//== changed Badges
    +
    +$badge-color:                 #fff;
    +
    +
    +//== changed Type
    +
    +$headings-small-color:        $gray-light;
    +
    +
    +// Bootswatch
    +// -----------------------------------------------------
    +@import "cyborg_variables.scss";
    +@import "cyborg_styles.scss";
    +
    +// added Forms ======================================================================
    +
    +.input-group-addon {
    +  background-color: $btn-default-bg;
    +}
    +
    +.badge.bg-warning {
    +  color: #000;
    +}
    +
    +.card.bg-secondary .card-header,
    +.card.bg-secondary .card-footer {
    +  color: $gray-lighter;
    +}
    +
    +// different code tag
    +code {
    +  background-color: $state-info-bg;
    +  color: $state-info-text;
    +}
    +
    +h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
    +    &.bg-warning {
    +        color: #000;
    +    }
    +}
    diff --git a/resources/assets/themes/theme5.less b/resources/assets/themes/theme5.less
    deleted file mode 100644
    index a5a4d739..00000000
    --- a/resources/assets/themes/theme5.less
    +++ /dev/null
    @@ -1,32 +0,0 @@
    -// 34c3 light (2017)
    -@import "../../../node_modules/bootstrap/less/variables";
    -
    -@brand-primary:         rgb(164, 28, 49);
    -@brand-success:         rgb(153, 204, 0);
    -@brand-info:            rgb(0, 204, 255);
    -@brand-warning:         rgb(255, 255, 51);
    -@brand-danger:          rgb(255, 102, 0);
    -
    -@link-color:            @brand-primary;
    -
    -@state-success-text:             darken(@brand-success,40%);
    -@state-success-bg:               lighten(@brand-success,40%);
    -@state-success-border:           @brand-success;
    -
    -@state-info-text:                darken(@brand-info,40%);
    -@state-info-bg:                  lighten(@brand-info,40%);
    -@state-info-border:              @brand-info;
    -
    -@state-warning-text:             darken(@brand-warning,40%);
    -@state-warning-bg:               @brand-warning;
    -@state-warning-border:           darken(@brand-warning,40%);
    -
    -@state-danger-text:              darken(@brand-danger,40%);
    -@state-danger-bg:                lighten(@brand-danger,40%);
    -@state-danger-border:            @brand-danger;
    -
    -.label.label-warning {
    -  color: #000;
    -}
    -
    -@import "base.less";
    diff --git a/resources/assets/themes/theme5.scss b/resources/assets/themes/theme5.scss
    new file mode 100644
    index 00000000..2b000f81
    --- /dev/null
    +++ b/resources/assets/themes/theme5.scss
    @@ -0,0 +1,43 @@
    +// 34c3 light (2017)
    +@import "light";
    +
    +$brand-primary: rgb(164, 28, 49);
    +$primary: rgb(164, 28, 49);
    +$brand-success: rgb(153, 204, 0);
    +$success: rgb(153, 204, 0);
    +$brand-info:    rgb(0, 204, 255);
    +$info:    rgb(0, 204, 255);
    +$brand-warning: rgb(255, 255, 51);
    +$warning: rgb(255, 255, 51);
    +$brand-danger:  rgb(255, 102, 0);
    +$danger:  rgb(255, 102, 0);
    +
    +$link-color:            $brand-primary;
    +
    +$state-success-text:             darken($brand-success,40%);
    +$state-success-bg:               lighten($brand-success,40%);
    +$state-success-border:           $brand-success;
    +
    +$state-info-text:                darken($brand-info,40%);
    +$state-info-bg:                  lighten($brand-info,40%);
    +$state-info-border:              $brand-info;
    +
    +$state-warning-text:             darken($brand-warning,40%);
    +$state-warning-bg:               $brand-warning;
    +$state-warning-border:           darken($brand-warning,40%);
    +
    +$state-danger-text:              darken($brand-danger,40%);
    +$state-danger-bg:                lighten($brand-danger,40%);
    +$state-danger-border:            $brand-danger;
    +
    +.badge.bg-warning {
    +  color: #000;
    +}
    +
    +@import "base.scss";
    +
    +h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
    +    &.bg-primary {
    +        color: #fff;
    +    }
    +}
    diff --git a/resources/assets/themes/theme6.less b/resources/assets/themes/theme6.less
    deleted file mode 100644
    index 28840926..00000000
    --- a/resources/assets/themes/theme6.less
    +++ /dev/null
    @@ -1,152 +0,0 @@
    -// 34c3 dark (2017)
    -@import "cyborg_variables.less";
    -// Variables
    -// --------------------------------------------------
    -
    -//== changed Colors
    -
    -@gray-dark:              #282828;   // #333
    -@gray-light:             #888;   // #999
    -@gray-lighter:           #ADAFAE; // #eee
    -
    -@brand-primary:         rgb(164, 28, 49);
    -@brand-success:         rgb(153, 204, 0);
    -@brand-info:            rgb(0, 204, 255);
    -@brand-warning:         rgb(255, 255, 51);
    -@brand-danger:          rgb(255, 102, 0);
    -
    -.label.label-warning, .progress-bar.progress-bar-warning {
    -  color: #000;
    -}
    -
    -
    -//== changed Buttons
    -
    -@btn-default-color:              #fff;
    -@btn-default-bg:                 lighten(@gray-dark, 10%);
    -
    -@btn-primary-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-success-border:             @btn-primary-border;
    -
    -@btn-info-border:                @btn-primary-border;
    -
    -@btn-warning-border:             @btn-primary-border;
    -
    -@btn-danger-border:              @btn-primary-border;
    -
    -@btn-link-disabled-color:        @gray-light;
    -
    -
    -//== changed Forms
    -
    -@input-bg:                       @gray-darker;
    -
    -@input-bg-disabled:              @gray-lighter;
    -
    -@input-group-addon-bg:           @gray-lighter;
    -
    -
    -//== changed Pagination
    -
    -@pagination-hover-color:               #fff;
    -
    -@pagination-active-color:              #fff;
    -
    -
    -//== changed Form states and alerts
    -
    -@state-success-text:             #fff;
    -@state-success-bg:               @brand-success;
    -@state-success-border:           darken(@state-success-bg, 5%);
    -
    -@state-info-text:                #fff;
    -@state-info-bg:                  @brand-info;
    -@state-info-border:              darken(@state-info-bg, 7%);
    -
    -@state-warning-text:             #000;
    -@state-warning-bg:               @brand-warning;
    -@state-warning-border:           darken(@state-warning-bg, 3%);
    -
    -@state-danger-text:              #fff;
    -@state-danger-bg:                @brand-danger;
    -@state-danger-border:            darken(@state-danger-bg, 3%);
    -
    -
    -//== changed List group
    -
    -@list-group-bg:                 darken(@gray-darker, 10%);
    -
    -
    -//== changed Panels
    -
    -@panel-bg:                    darken(@gray-darker, 10%);
    -
    -@panel-default-heading-bg:    darken(@gray-darker, 5%);
    -
    -
    -//== changed Badges
    -
    -@badge-color:                 #fff;
    -
    -@badge-link-hover-color:      #fff;
    -
    -
    -//== changed Type
    -
    -@headings-small-color:        @gray-light;
    -
    -
    -// Bootswatch
    -// -----------------------------------------------------
    -
    -@import "cyborg_styles.less";
    -
    -// Typography =================================================================
    -
    -.text-primary,
    -.text-primary:hover,
    -a.text-primary,
    -a.text-primary:hover {
    -  color: @brand-primary;
    -}
    -
    -.text-success,
    -.text-success:hover,
    -a.text-success,
    -a.text-success:hover {
    -  color: @brand-success;
    -}
    -
    -.text-danger,
    -.text-danger:hover,
    -a.text-danger,
    -a.text-danger:hover {
    -  color: @brand-danger;
    -}
    -
    -.text-warning,
    -.text-warning:hover,
    -a.text-warning,
    -a.text-warning:hover {
    -  color: @brand-warning;
    -}
    -
    -.text-info,
    -.text-info:hover,
    -a.text-info,
    -a.text-info:hover {
    -  color: @brand-info;
    -}
    -
    -// added Forms ======================================================================
    -
    -.input-group-addon {
    -  background-color: @btn-default-bg;
    -}
    -
    -// different code tag
    -code {
    -  background-color: @input-bg;
    -  color: @input-color;
    -}
    diff --git a/resources/assets/themes/theme6.scss b/resources/assets/themes/theme6.scss
    new file mode 100644
    index 00000000..db4b7914
    --- /dev/null
    +++ b/resources/assets/themes/theme6.scss
    @@ -0,0 +1,159 @@
    +// 34c3 dark (2017)
    +// Variables
    +// --------------------------------------------------
    +@import "dark";
    +
    +//== changed Colors
    +
    +$gray-dark:    #282828;
    +$gray-light:   #888;
    +$gray-darker:  #222;
    +$gray-lighter: #ADAFAE;
    +
    +$brand-primary: rgb(164, 28, 49);
    +$primary:       rgb(164, 28, 49);
    +$brand-success: rgb(153, 204, 0);
    +$success:       rgb(153, 204, 0);
    +$brand-info:    rgb(0, 204, 255);
    +$info:          rgb(0, 204, 255);
    +$brand-warning: rgb(255, 255, 51);
    +$warning:       rgb(255, 255, 51);
    +$brand-danger:  rgb(255, 102, 0);
    +$danger:        rgb(255, 102, 0);
    +
    +$secondary: #424242;
    +
    +$alert-bg-scale: 0%;
    +
    +.badge.bg-warning, .progress-bar.progress-bar-warning {
    +  color: #000;
    +}
    +
    +
    +//== changed Buttons
    +
    +$btn-color:                      #fff;
    +$btn-default-bg:                 lighten($gray-dark, 10%);
    +
    +$btn-primary-border:             darken($btn-default-bg, 10%);
    +
    +$btn-success-border:             $btn-primary-border;
    +
    +$btn-info-border:                $btn-primary-border;
    +
    +$btn-warning-border:             $btn-primary-border;
    +
    +$btn-danger-border:              $btn-primary-border;
    +
    +$btn-link-disabled-color:        $gray-light;
    +
    +
    +//== changed Forms
    +
    +$input-bg:                       $gray-darker;
    +
    +$input-bg-disabled:              $gray-lighter;
    +
    +$input-group-addon-bg:           $gray-lighter;
    +
    +
    +//== changed Pagination
    +
    +$pagination-hover-color:               #fff;
    +
    +$pagination-active-color:              #fff;
    +
    +
    +//== changed Form states and alerts
    +
    +$state-success-text:             #fff;
    +$state-success-bg:               $brand-success;
    +$state-success-border:           darken($state-success-bg, 5%);
    +
    +$state-info-text:                #fff;
    +$state-info-bg:                  $brand-info;
    +$state-info-border:              darken($state-info-bg, 7%);
    +
    +$state-warning-text:             #000;
    +$state-warning-bg:               $brand-warning;
    +$state-warning-border:           darken($state-warning-bg, 3%);
    +
    +$state-danger-text:              #fff;
    +$state-danger-bg:                $brand-danger;
    +$state-danger-border:            darken($state-danger-bg, 3%);
    +
    +
    +//== changed List group
    +
    +$list-group-bg:                 darken($gray-darker, 10%);
    +
    +//== changed Badges
    +
    +$badge-color:                 #fff;
    +
    +
    +//== changed Type
    +
    +$headings-small-color:        $gray-light;
    +
    +
    +// Bootswatch
    +// -----------------------------------------------------
    +
    +@import "cyborg_variables.scss";
    +@import "cyborg_styles.scss";
    +
    +// Typography =================================================================
    +
    +.text-primary,
    +.text-primary:hover,
    +a.text-primary,
    +a.text-primary:hover {
    +  color: $brand-primary;
    +}
    +
    +.text-success,
    +.text-success:hover,
    +a.text-success,
    +a.text-success:hover {
    +  color: $brand-success;
    +}
    +
    +.text-danger,
    +.text-danger:hover,
    +a.text-danger,
    +a.text-danger:hover {
    +  color: $brand-danger;
    +}
    +
    +.text-warning,
    +.text-warning:hover,
    +a.text-warning,
    +a.text-warning:hover {
    +  color: $brand-warning;
    +}
    +
    +.text-info,
    +.text-info:hover,
    +a.text-info,
    +a.text-info:hover {
    +  color: $brand-info;
    +}
    +
    +// added Forms ======================================================================
    +
    +.input-group-addon {
    +  background-color: $btn-default-bg;
    +}
    +
    +// different code tag
    +code {
    +  background-color: $input-bg;
    +  color: $input-color;
    +}
    +
    +h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
    +    &.bg-warning {
    +        color: #000;
    +    }
    +}
    diff --git a/resources/assets/themes/theme7.less b/resources/assets/themes/theme7.less
    deleted file mode 100644
    index a5d1529f..00000000
    --- a/resources/assets/themes/theme7.less
    +++ /dev/null
    @@ -1,280 +0,0 @@
    -// 35c3 dark (2018)
    -@import "cyborg_variables.less";
    -
    -// Variables
    -// --------------------------------------------------
    -
    -//== changed Colors
    -
    -// gray BEBOOT: #4d4d4c
    -// blue FRESH: #0084b0
    -// green HOPE: #00a356
    -// dark blue BASE: #18386b
    -// orange GLINT: #f9b000
    -// rot BEAT: #e40429
    -// violet TENACY: #44357e
    -
    -@gray-darker:            #000;
    -@gray-dark:              #000;
    -@gray:                   #4d4d4c; // BEBOOT
    -@gray-light:             @gray;
    -@gray-lighter:           lighten(@gray, 15%);
    -
    -@brand-primary:         #0084b0; // FRESH
    -@brand-success:         #00a356; // HOPE
    -@brand-info:            @brand-primary;
    -@brand-warning:         #f9b000; // GLINT
    -@brand-danger:          #e40429; // BEAT
    -
    -
    -//== changed Scaffolding
    -
    -@body-bg:               #000;
    -
    -@text-color:            @gray-lighter;
    -
    -@link-hover-color:      lighten(@link-color, 10%);
    -
    -
    -//== changed Typography
    -
    -@headings-color:          @brand-primary;
    -
    -
    -//== changed Tables
    -
    -@table-bg:                      @gray-darker;
    -
    -@table-bg-accent:               #111;
    -
    -@table-border-color:            @gray;
    -
    -
    -//== changed Buttons
    -
    -@btn-default-color:              @link-color;
    -@btn-default-bg:                 @gray-darker;
    -
    -@btn-default-border:             @brand-primary;
    -
    -@btn-primary-color:              @gray-darker;
    -@btn-primary-border:             @brand-primary;
    -
    -@btn-success-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-info-color:                 @gray-darker;
    -@btn-info-border:                darken(@btn-default-bg, 10%);
    -
    -@btn-warning-color:              @gray-darker;
    -@btn-warning-border:             darken(@btn-default-bg, 10%);
    -
    -@btn-danger-color:               @gray-darker;
    -@btn-danger-border:              darken(@btn-default-bg, 10%);
    -
    -
    -//== changed Forms
    -
    -@input-bg:                       @gray-darker;
    -
    -@input-color:                    @link-color;
    -
    -@input-border:                   @brand-primary;
    -
    -@input-group-addon-bg:           @gray-lighter;
    -
    -
    -//== changed Dropdowns
    -
    -@dropdown-border:                @brand-primary;
    -
    -@dropdown-fallback-border:       @brand-primary;
    -
    -@dropdown-divider-bg:            @dropdown-border;
    -
    -@dropdown-link-color:            @link-color;
    -
    -@dropdown-link-hover-color:      @link-hover-color;
    -
    -@dropdown-link-hover-bg:         @dropdown-bg;
    -
    -
    -//== changed Navbar
    -
    -@navbar-default-border:            @brand-primary;
    -
    -@navbar-default-link-hover-color:          @link-hover-color;
    -
    -@navbar-default-link-active-color:         @brand-primary;
    -
    -@navbar-default-brand-color:               @brand-primary;
    -@navbar-default-brand-hover-color:         lighten(@brand-primary, 10%);
    -
    -
    -//== changed Pagination
    -
    -@pagination-color:                     @brand-primary;
    -@pagination-border:                    @brand-primary;
    -
    -@pagination-hover-color:               @gray-darker;
    -@pagination-hover-border:              @pagination-border;
    -
    -@pagination-active-color:              @pagination-hover-color;
    -@pagination-active-bg:                 @pagination-hover-bg;
    -@pagination-active-border:             @pagination-hover-border;
    -
    -
    -//== changed Form states and alerts
    -
    -@state-success-text:             @gray-darker;
    -@state-success-bg:               @brand-success;
    -@state-success-border:           darken(@state-success-bg, 5%);
    -
    -@state-info-text:                @gray-darker;
    -@state-info-bg:                  @brand-info;
    -@state-info-border:              darken(@state-info-bg, 7%);
    -
    -@state-warning-text:             @gray-darker;
    -@state-warning-bg:               @brand-warning;
    -@state-warning-border:           darken(@state-warning-bg, 3%);
    -
    -@state-danger-text:              @gray-darker;
    -@state-danger-bg:                @brand-danger;
    -@state-danger-border:            darken(@state-danger-bg, 3%);
    -
    -
    -//== changed Labels
    -
    -@label-color:                 @gray-darker;
    -
    -@label-link-hover-color:      @brand-primary;
    -
    -//== changed Panels
    -
    -@panel-default-border:        @brand-primary;
    -@panel-default-heading-bg:    @gray-darker;
    -
    -@panel-primary-text:          @gray-darker;
    -
    -
    -//== changed Badges
    -
    -@badge-color:                 #fff;
    -
    -@badge-link-hover-color:      #fff;
    -
    -
    -//== changed Type
    -
    -@headings-small-color:        @gray-light;
    -
    -@import "cyborg_styles.less";
    -
    -.messages .text-danger {
    -  color: @gray-darker;
    -}
    -
    -.messages .text-info {
    -  color: @gray-darker;
    -}
    -
    -.messages .caret {
    -  color: @gray-darker;
    -}
    -
    -
    -// Bootswatch
    -// -----------------------------------------------------
    -// changed Typography =================================================================
    -
    -.text-primary,
    -.text-primary:hover,
    -a.text-primary:hover {
    -  color: @brand-primary;
    -}
    -
    -.text-success,
    -.text-success:hover,
    -a.text-success:hover {
    -  color: @brand-success;
    -}
    -
    -.text-danger,
    -.text-danger:hover,
    -a.text-danger:hover {
    -  color: @brand-danger;
    -}
    -
    -.text-warning,
    -.text-warning:hover,
    -a.text-warning:hover {
    -  color: @brand-warning;
    -}
    -
    -.text-info,
    -.text-info:hover,
    -a.text-info:hover {
    -  color: @brand-info;
    -}
    -
    -// changed Tables =====================================================================
    -
    -table,
    -.table {
    -  color: @text-color;
    -
    -  a:not(.btn) {
    -    color: @brand-primary;
    -    text-decoration: underline;
    -  }
    -
    -  .text-muted {
    -    color: @text-muted;
    -  }
    -}
    -
    -// changed Forms ======================================================================
    -
    -.input-group-addon {
    -  background-color: @btn-default-bg;
    -}
    -
    -// changed Indicators =================================================================
    -
    -.alert {
    -
    -  .h1, .h2, .h3, .h4, .h5, .h6,
    -  h1, h2, h3, h4, h5, h6 {
    -    color: #fff;
    -  }
    -
    -  .alert-link,
    -  a {
    -    color: @alert-warning-text;
    -    text-decoration: underline;
    -  }
    -
    -  .close {
    -    text-decoration: none;
    -  }
    -}
    -
    -// changed Containers =================================================================
    -
    -.btn-primary, .panel-info .panel-heading {
    -  background-image: linear-gradient(to right, rgb(0, 132, 176) , rgb(0, 163, 86));
    -}
    -
    -.label-warning {
    -  color: #000;
    -}
    -
    -// changed code tag
    -code {
    -  background-color: @state-info-bg;
    -  color: @state-info-text;
    -}
    -h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
    -  code {
    -    color: @headings-color;
    -  }
    -}
    diff --git a/resources/assets/themes/theme7.scss b/resources/assets/themes/theme7.scss
    new file mode 100644
    index 00000000..cac5c8d9
    --- /dev/null
    +++ b/resources/assets/themes/theme7.scss
    @@ -0,0 +1,283 @@
    +// 35c3 dark (2018)
    +
    +// Variables
    +// --------------------------------------------------
    +@import "dark";
    +
    +$gray-darker:  #000;
    +$gray-dark:    #000;
    +$gray:         #4d4d4c; // BEBOOT
    +$gray-light:   $gray;
    +$gray-lighter: lighten($gray, 15%);
    +
    +$brand-primary: #0084b0; // FRESH
    +$primary:       #0084b0;
    +$brand-success: #00a356; // HOPE
    +$success:       #00a356; // HOPE
    +$brand-info:    $brand-primary;
    +$info:          $brand-primary;
    +$brand-warning: #f9b000; // GLINT
    +$warning:       #f9b000; // GLINT
    +$brand-danger:  #e40429; // BEAT
    +$danger:        #e40429; // BEAT
    +
    +
    +//== changed Scaffolding
    +
    +$text-color: $gray-lighter;
    +
    +$body-bg:    #000;
    +$body-color: $text-color;
    +
    +$link-color:       $brand-primary;
    +$link-hover-color: lighten($link-color, 10%);
    +
    +
    +//== changed Typography
    +
    +$headings-color: $brand-primary;
    +
    +
    +//== changed Tables
    +
    +$table-bg:           $gray-darker;
    +$table-bg-accent:    #111;
    +$table-border-color: $gray;
    +
    +
    +// component
    +
    +$component-active-color: #fff;
    +$component-active-bg:    $primary;
    +
    +
    +//== changed Buttons
    +
    +$btn-color:      $link-color;
    +$btn-default-bg: $gray-darker;
    +
    +$btn-default-border: $brand-primary;
    +
    +$btn-primary-color:  $gray-darker;
    +$btn-primary-border: $brand-primary;
    +
    +$btn-success-border: darken($btn-default-bg, 10%);
    +
    +$btn-info-color:  $gray-darker;
    +$btn-info-border: darken($btn-default-bg, 10%);
    +
    +$btn-warning-color:  $gray-darker;
    +$btn-warning-border: darken($btn-default-bg, 9%);
    +
    +$btn-danger-color:  $gray-darker;
    +$btn-danger-border: darken($btn-default-bg, 10%);
    +
    +
    +//== changed Forms
    +
    +$input-bg:             $gray-darker;
    +$input-color:          $link-color;
    +$input-border-color:   $brand-primary;
    +$input-group-addon-bg: $gray-lighter;
    +
    +
    +//== changed Dropdowns
    +
    +$dropdown-border:                $brand-primary;
    +$dropdown-fallback-border:       $brand-primary;
    +$dropdown-divider-bg:            $dropdown-border;
    +$dropdown-link-color:            $link-color;
    +$dropdown-link-hover-color:      $link-hover-color;
    +$dropdown-bg:                    $gray-darker;
    +$dropdown-link-hover-bg:         $dropdown-bg;
    +
    +
    +//== changed Navbar
    +
    +$navbar-default-border:             $brand-primary;
    +$navbar-default-link-hover-color:   $link-hover-color;
    +$navbar-default-link-active-color:  $brand-primary;
    +$navbar-default-brand-color:        $brand-primary;
    +$navbar-default-brand-hover-color:  lighten($brand-primary, 10%);
    +
    +
    +//== changed Pagination
    +
    +$pagination-color:         $brand-primary;
    +$pagination-border:        $brand-primary;
    +
    +$pagination-hover-color:   $gray-darker;
    +$pagination-hover-bg:      $component-active-bg;
    +$pagination-hover-border:  $pagination-border;
    +
    +$pagination-active-color:  $pagination-hover-color;
    +$pagination-active-bg:     $pagination-hover-bg;
    +$pagination-active-border: $pagination-hover-border;
    +
    +
    +//== changed Form states and alerts
    +
    +$state-success-text:   $gray-darker;
    +$state-success-bg:     $brand-success;
    +$state-success-border: darken($state-success-bg, 5%);
    +
    +$state-info-text:      $gray-darker;
    +$state-info-bg:        $brand-info;
    +$state-info-border:    darken($state-info-bg, 7%);
    +
    +$state-warning-text:   $gray-darker;
    +$state-warning-bg:     $brand-warning;
    +$state-warning-border: darken($state-warning-bg, 3%);
    +
    +$state-danger-text:    $gray-darker;
    +$state-danger-bg:      $brand-danger;
    +$state-danger-border:  darken($state-danger-bg, 3%);
    +
    +
    +//== changed Labels
    +
    +$label-color:            $gray-darker;
    +$label-link-hover-color: $brand-primary;
    +
    +
    +//== changed Type
    +
    +$headings-small-color:        $gray-light;
    +
    +$alert-bg-scale: 0%;
    +$alert-border-scale: 0;
    +$alert-color-scale: 0;
    +
    +@import "cyborg_variables.scss";
    +@import "cyborg_styles.scss";
    +
    +.messages .text-danger {
    +  color: $gray-darker;
    +}
    +
    +.messages .text-info {
    +  color: $gray-darker;
    +}
    +
    +.messages .caret {
    +  color: $gray-darker;
    +}
    +
    +
    +// Bootswatch
    +// -----------------------------------------------------
    +// changed Typography =================================================================
    +
    +.text-primary,
    +.text-primary:hover,
    +a.text-primary:hover {
    +  color: $brand-primary;
    +}
    +
    +.text-success,
    +.text-success:hover,
    +a.text-success:hover {
    +  color: $brand-success;
    +}
    +
    +.text-danger,
    +.text-danger:hover,
    +a.text-danger:hover {
    +  color: $brand-danger;
    +}
    +
    +.text-warning,
    +.text-warning:hover,
    +a.text-warning:hover {
    +  color: $brand-warning;
    +}
    +
    +.text-info,
    +.text-info:hover,
    +a.text-info:hover {
    +  color: $brand-info;
    +}
    +
    +// changed Tables =====================================================================
    +
    +table,
    +.table {
    +  color: $text-color;
    +
    +  a:not(.btn) {
    +    color: $brand-primary;
    +    text-decoration: underline;
    +  }
    +
    +  .text-muted {
    +    color: $text-muted;
    +  }
    +}
    +
    +// changed Forms ======================================================================
    +
    +.input-group-addon {
    +  background-color: $btn-default-bg;
    +}
    +
    +// changed Indicators =================================================================
    +
    +.alert {
    +
    +  .h1, .h2, .h3, .h4, .h5, .h6,
    +  h1, h2, h3, h4, h5, h6 {
    +    color: #fff;
    +  }
    +
    +  .alert-link,
    +  a {
    +    color: $alert-warning-text;
    +    text-decoration: underline;
    +  }
    +
    +  .close {
    +    text-decoration: none;
    +  }
    +}
    +
    +// changed Containers =================================================================
    +
    +.btn-primary, .card-info .card-heading {
    +  background-image: linear-gradient(to right, rgb(0, 132, 176) , rgb(0, 163, 86));
    +}
    +
    +.btn-secondary {
    +  color: $primary;
    +  background-color: #000;
    +  border-color: $primary;
    +
    +  &:hover {
    +    color: $primary;
    +    background-color: #000;
    +    border-color: darken($primary, 10%);
    +  }
    +}
    +
    +.bg-warning {
    +  color: #000;
    +}
    +
    +// changed code tag
    +code {
    +  background-color: $state-info-bg;
    +  color: $state-info-text;
    +}
    +
    +h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
    +  code {
    +    color: $headings-color;
    +  }
    +
    +  &.bg-primary,
    +  &.bg-secondary,
    +  &.bg-success,
    +  &.bg-danger,
    +  &.bg-info {
    +      color: #fff;
    +  }
    +}
    diff --git a/resources/assets/themes/theme8.less b/resources/assets/themes/theme8.less
    deleted file mode 100644
    index b07e1f36..00000000
    --- a/resources/assets/themes/theme8.less
    +++ /dev/null
    @@ -1,57 +0,0 @@
    -// cccamp19 blue (2019)
    -@import "cyborg_variables.less";
    -
    -// Variables
    -// --------------------------------------------------
    -
    -//== changed Colors
    -
    -@gray-dark:              #282828;   // #333
    -@gray-light:             #888;   // #999
    -@gray-lighter:           #ADAFAE; // #eee
    -
    -@brand-primary:         #0076ba;
    -
    -@import "cyborg_styles.less";
    -
    -// Specials for cccamp19 design
    -
    -.navbar-brand {
    -  .icon-icon_angel {
    -    background-color: @brand-primary;
    -  }
    -
    -  strong {
    -    font-weight: lighter;
    -    color: @brand-primary;
    -    text-shadow:
    -      0 0 10px @brand-primary,
    -      0 0 20px @brand-primary,
    -      0 0 30px @brand-primary,
    -      0 0 40px @brand-primary,
    -      0 0 70px @brand-primary,
    -      0 0 80px @brand-primary;
    -  }
    -}
    -
    -h1 {
    -  font-weight: lighter;
    -  color: @brand-primary;
    -  text-shadow: 0 0 10px @brand-primary;
    -
    -  .icon-icon_angel {
    -    background-color: @brand-primary;
    -  }
    -}
    -
    -.panel-title {
    -  color: #fff;
    -}
    -
    -.input-group-addon {
    -  color: #000;
    -
    -  .icon-icon_angel {
    -    background-color: #000;
    -  }
    -}
    diff --git a/resources/assets/themes/theme8.scss b/resources/assets/themes/theme8.scss
    new file mode 100644
    index 00000000..bf7055eb
    --- /dev/null
    +++ b/resources/assets/themes/theme8.scss
    @@ -0,0 +1,63 @@
    +// cccamp19 blue (2019)
    +
    +// Variables
    +@import "dark";
    +
    +//== changed Colors
    +
    +$gray-dark:    #282828;
    +$gray-light:   #888;
    +$gray-lighter: #ADAFAE;
    +
    +$brand-primary: #0076ba;
    +$primary:       #0076ba;
    +
    +$text-muted: $primary;
    +
    +@import "cyborg_variables.scss";
    +@import "cyborg_styles.scss";
    +
    +// Specials for cccamp19 design
    +@import "card-glow";
    +
    +.navbar-brand {
    +  .icon-icon_angel {
    +    background-color: $brand-primary;
    +  }
    +
    +  strong {
    +    font-weight: normal;
    +    color: $brand-primary;
    +    text-shadow:
    +      0 0 10px $brand-primary,
    +      0 0 20px $brand-primary,
    +      0 0 30px $brand-primary,
    +      0 0 40px $brand-primary,
    +      0 0 70px $brand-primary,
    +      0 0 80px $brand-primary;
    +  }
    +}
    +
    +h1 {
    +  font-weight: normal;
    +  color: $brand-primary;
    +  text-shadow: 0 0 10px $brand-primary;
    +
    +  .icon-icon_angel {
    +    background-color: $brand-primary;
    +  }
    +}
    +
    +.input-group-addon {
    +  color: #000;
    +
    +  .icon-icon_angel {
    +    background-color: #000;
    +  }
    +}
    +
    +h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
    +    &.bg-warning {
    +        color: #000;
    +    }
    +}
    diff --git a/resources/assets/themes/theme9.less b/resources/assets/themes/theme9.less
    deleted file mode 100644
    index e3826066..00000000
    --- a/resources/assets/themes/theme9.less
    +++ /dev/null
    @@ -1,57 +0,0 @@
    -// cccamp19 yellow (2019)
    -@import "cyborg_variables.less";
    -
    -// Variables
    -// --------------------------------------------------
    -
    -//== changed Colors
    -
    -@gray-dark:              #282828;   // #333
    -@gray-light:             #888;   // #999
    -@gray-lighter:           #ADAFAE; // #eee
    -
    -@brand-primary:         #ffc600;
    -
    -@import "cyborg_styles.less";
    -
    -// Specials for cccamp19 design
    -
    -.navbar-brand {
    -  .icon-icon_angel {
    -    background-color: @brand-primary;
    -  }
    -
    -  strong {
    -    font-weight: lighter;
    -    color: @brand-primary;
    -    text-shadow:
    -      0 0 10px @brand-primary,
    -      0 0 20px @brand-primary,
    -      0 0 30px @brand-primary,
    -      0 0 40px @brand-primary,
    -      0 0 70px @brand-primary,
    -      0 0 80px @brand-primary;
    -  }
    -}
    -
    -h1 {
    -  font-weight: lighter;
    -  color: @brand-primary;
    -  text-shadow: 0 0 10px @brand-primary;
    -
    -  .icon-icon_angel {
    -    background-color: @brand-primary;
    -  }
    -}
    -
    -.panel-title {
    -  color: #fff;
    -}
    -
    -.input-group-addon {
    -  color: #000;
    -
    -  .icon-icon_angel {
    -    background-color: #000;
    -  }
    -}
    diff --git a/resources/assets/themes/theme9.scss b/resources/assets/themes/theme9.scss
    new file mode 100644
    index 00000000..16dfbb8b
    --- /dev/null
    +++ b/resources/assets/themes/theme9.scss
    @@ -0,0 +1,65 @@
    +// cccamp19 yellow (2019)
    +
    +// Variables
    +// --------------------------------------------------
    +@import "dark";
    +
    +//== changed Colors
    +
    +$gray-dark:              #282828;
    +$gray-light:             #888;
    +$gray-lighter:           #ADAFAE;
    +
    +$brand-primary: #ffc600;
    +$primary:       $brand-primary;
    +
    +$text-muted: $primary;
    +
    +@import "cyborg_variables.scss";
    +@import "cyborg_styles.scss";
    +
    +// Specials for cccamp19 design
    +@import "card-glow";
    +
    +.navbar-brand {
    +  .icon-icon_angel {
    +    background-color: $brand-primary;
    +  }
    +
    +  strong {
    +    font-weight: normal;
    +    color: $brand-primary;
    +    text-shadow:
    +      0 0 10px $brand-primary,
    +      0 0 20px $brand-primary,
    +      0 0 30px $brand-primary,
    +      0 0 40px $brand-primary,
    +      0 0 70px $brand-primary,
    +      0 0 80px $brand-primary;
    +  }
    +}
    +
    +h1 {
    +  font-weight: normal;
    +  color: $brand-primary;
    +  text-shadow: 0 0 10px $brand-primary;
    +
    +  .icon-icon_angel {
    +    background-color: $brand-primary;
    +  }
    +}
    +
    +.input-group-addon {
    +  color: #000;
    +
    +  .icon-icon_angel {
    +    background-color: #000;
    +  }
    +}
    +
    +h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
    +    &.bg-primary,
    +    &.bg-warning {
    +        color: #000;
    +    }
    +}
    diff --git a/resources/lang/de_DE/additional.po b/resources/lang/de_DE/additional.po
    index c2507d80..9b1dd9e8 100644
    --- a/resources/lang/de_DE/additional.po
    +++ b/resources/lang/de_DE/additional.po
    @@ -53,6 +53,9 @@ msgstr "Der Schichttyp konnte nicht gefunden werden."
     msgid "schedule.import.success"
     msgstr "Das Programm wurde erfolgreich importiert."
     
    +msgid "shifts.filter.toggle"
    +msgstr "Filter verstecken/anzeigen"
    +
     msgid "validation.schedule-url.required"
     msgstr "Bitte gib eine Programm URL an."
     
    diff --git a/resources/lang/en_US/additional.po b/resources/lang/en_US/additional.po
    index 0a828419..58ac24a7 100644
    --- a/resources/lang/en_US/additional.po
    +++ b/resources/lang/en_US/additional.po
    @@ -51,6 +51,9 @@ msgstr "The shift type can't not be found."
     msgid "schedule.import.success"
     msgstr "Schedule import successful."
     
    +msgid "shifts.filter.toggle"
    +msgstr "collapse/show filters"
    +
     msgid "validation.schedule-url.required"
     msgstr "The schedule URL is required."
     
    diff --git a/resources/views/admin/log.twig b/resources/views/admin/log.twig
    index f5b10754..bb723000 100644
    --- a/resources/views/admin/log.twig
    +++ b/resources/views/admin/log.twig
    @@ -10,7 +10,7 @@
     
             
    -
    +
    {{ csrf() }} @@ -44,9 +44,9 @@ {%- endif %} - {{ entry.created_at.format(__('Y-m-d H:i')) }} - - {{ entry.level|capitalize }} + {{ entry.created_at.format(__('Y-m-d H:i')) }} + + {{ entry.level|capitalize }} {{ entry.message|nl2br }} diff --git a/resources/views/admin/schedule/index.twig b/resources/views/admin/schedule/index.twig index 99a1a226..d2c8425e 100644 --- a/resources/views/admin/schedule/index.twig +++ b/resources/views/admin/schedule/index.twig @@ -10,7 +10,7 @@ {% block content_title %}{{ title }}{% endblock %} {% if is_index|default(false) %} - {{ m.button(m.glyphicon('plus'), url('/admin/schedule/edit')) }} + {{ m.button(m.icon('plus-lg'), url('/admin/schedule/edit'), 'secondary') }} {% endif %} @@ -40,12 +40,12 @@ diff --git a/resources/views/errors/404.twig b/resources/views/errors/404.twig index deff010a..620aaa2d 100644 --- a/resources/views/errors/404.twig +++ b/resources/views/errors/404.twig @@ -4,10 +4,10 @@ {% block content_container %}
    -
    +

    4:{{ status|slice(1, 2) }} - {{ __("No sleep found") }} + {{ __("No sleep found") }}

    {% block content_text %} diff --git a/resources/views/layouts/app.twig b/resources/views/layouts/app.twig index 12e81ac0..de3ae985 100644 --- a/resources/views/layouts/app.twig +++ b/resources/views/layouts/app.twig @@ -1,4 +1,3 @@ -{% set theme = theme|default(user.settings.theme|default(config('theme'))) %} @@ -9,13 +8,13 @@ - + {% if page() in ['news', 'meetings'] and is_user() and has_permission_to('atom') -%} {% set parameters = {'key': user.api_key} -%} {% if page() == 'meetings' -%} - {% set parameters = parameters|merge({'meetings': 1}) -%} + {% set parameters = {'meetings': 1}|merge(parameters) -%} {% endif %} {% endif %} @@ -30,12 +29,12 @@ {% endblock %}
    -
    +
    {% block content %} {{ content|raw }} {% endblock %}
    -