diff --git a/.gitignore b/.gitignore index 55f3edb0..0189cb63 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +/modules +/templates + # published files from modules /public/modules /public/assets @@ -9,9 +12,6 @@ **/views/**/custom/* !**/views/**/custom/.gitkeep -# module config - generated in ModuleManager service provider -**/module.json - # uploaded files /public/uploads/* !/public/uploads/.gitkeep @@ -32,4 +32,5 @@ /public/js /public/fonts /bower_components -.sass-cache \ No newline at end of file +.sass-cache +!/resources/views/vendor/ diff --git a/app/CMS/Contracts/Repositories/Module.php b/app/CMS/Contracts/Repositories/Module.php index bc94ff5b..e00e372a 100644 --- a/app/CMS/Contracts/Repositories/Module.php +++ b/app/CMS/Contracts/Repositories/Module.php @@ -10,7 +10,7 @@ interface Module extends BaseRepository public function getUpdateContentTitle(ModuleModel $module, ContentModel $content = null); - public function getOverviewTitle(ModuleModel $module); + public function getOverviewTitle(ModuleModel $module = null); public function getByHandler($handler); diff --git a/app/CMS/Enumerations/UserRoles.php b/app/CMS/Enumerations/UserRoles.php index 735592f3..6aabee15 100644 --- a/app/CMS/Enumerations/UserRoles.php +++ b/app/CMS/Enumerations/UserRoles.php @@ -9,7 +9,7 @@ class UserRoles extends BaseEnumeration { $roles = [ User::ROLE_ADMIN => 'admin/userManagement.role_' . User::ROLE_ADMIN, - User::ROLE_EDITOR => 'admin/userManagement.role_' . User::ROLE_EDITOR, +// User::ROLE_EDITOR => 'admin/userManagement.role_' . User::ROLE_EDITOR, User::ROLE_VISITOR => 'admin/userManagement.role_' . User::ROLE_VISITOR ]; diff --git a/app/CMS/Handlers/Handler.php b/app/CMS/Handlers/AdminHandler.php similarity index 75% rename from app/CMS/Handlers/Handler.php rename to app/CMS/Handlers/AdminHandler.php index 420fae52..4b3533a1 100644 --- a/app/CMS/Handlers/Handler.php +++ b/app/CMS/Handlers/AdminHandler.php @@ -1,19 +1,17 @@ trans('admin/contents.basicInfo'), 'meta' => trans('admin/contents.metaOptions'), 'publication' => trans('admin/contents.publicationOptions'), 'appearance' => trans('admin/contents.appearance'), 'files' => trans('admin/contents.files') ]; + + if (\Auth::user()->cannot('upload', File::class)) { + unset($formParts['files']); + } + + return $formParts; } public static function getExtendedFormInputsCreate() { - return [ + $formParts = [ 'basicInfo' => 'admin.content.formParts.basicInformation', 'meta' => 'admin.content.formParts.metaInformation', 'publication' => 'admin.content.formParts.publicationSetup', 'appearance' => 'admin.content.formParts.appearance', 'files' => 'admin.content.formParts.files' ]; + + if (\Auth::user()->cannot('upload', File::class)) { + unset($formParts['files']); + } + + return $formParts; } - + public static function getExtendedFormInputsEdit() { return self::getExtendedFormInputsCreate(); diff --git a/app/CMS/Handlers/BaseHandler.php b/app/CMS/Handlers/BaseHandler.php index c7ae9574..2dbff17e 100644 --- a/app/CMS/Handlers/BaseHandler.php +++ b/app/CMS/Handlers/BaseHandler.php @@ -1,16 +1,24 @@ route('admin.dashboard', trans('admin/mainMenu.dashboard'), [], 10, ['icon' => 'fa fa-fw fa-dashboard']); /** * Content pages - * * Submenus can be registered later */ - $menu->dropdown(trans('admin/mainMenu.contentPages'), function ($sub) { - $sub->route('content.overview', trans('admin/mainMenu.contentPageOverview'), [], 10000, ['icon' => 'fa fa-fw fa-list']); - }, 20, ['icon' => 'fa fa-fw fa-database']); + $contentModules = app(Module::class)->getContentModules(); + + if ($user->can('manage', Content::class) && !$contentModules->isEmpty()) { + $menu->dropdown(trans('admin/mainMenu.contentPages'), function ($sub) { + $sub->route('content.order', trans('admin/mainMenu.contentOrder'), [], 999, ['icon' => 'fa fa-fw fa-reorder']); + $sub->route('content.overview', trans('admin/mainMenu.contentPageOverview'), [], 10000, ['icon' => 'fa fa-fw fa-list']); + }, 20, ['icon' => 'fa fa-fw fa-database']); + } /** * File manager */ - $menu->route('upload.overview', trans('admin/mainMenu.fileManager'), [], 40, ['icon' => 'fa fa-fw fa-folder']); + if ($user->can('manage', File::class)) { + $menu->route('upload.overview', trans('admin/mainMenu.fileManager'), [], 40, ['icon' => 'fa fa-fw fa-folder']); + } /** * Widgets and widget areas */ - $menu->dropdown(trans('admin/mainMenu.widgets'), function ($sub) { - // create list of all widget types - $widgets = WidgetTypes::getWithTranslations(); + if ($user->can('manage', Widget::class) || $user->can('manage', WidgetArea::class)) { + $menu->dropdown(trans('admin/mainMenu.widgets'), function ($sub) use ($user) { + // create list of all widget types + $widgets = WidgetTypes::getWithTranslations(); - if (!empty($widgets)) { - $sub->dropdown(trans('admin/mainMenu.newWidget'), function ($sub) use ($widgets) { - $i = 1; - foreach ($widgets as $type => $name) { - $sub->route('widgets.new', $name, ['type' => $type], $i++); - } - }, 10, ['icon' => 'fa fa-fw fa-plus']); - } + if (!empty($widgets) && $user->can('create', Widget::class)) { + $sub->dropdown(trans('admin/mainMenu.newWidget'), function ($sub) use ($widgets) { + $i = 1; + foreach ($widgets as $type => $name) { + $sub->route('widgets.new', $name, ['type' => $type], $i++); + } + }, 10, ['icon' => 'fa fa-fw fa-plus']); + } + if ($user->can('manage', Widget::class)) { + $sub->route('widgets.overview', trans('admin/mainMenu.widgetsOverview'), [], 20, ['icon' => 'fa fa-fw fa-list']); + } - $sub->route('widgets.overview', trans('admin/mainMenu.widgetsOverview'), [], 20, ['icon' => 'fa fa-fw fa-list']); - - // menu for widget areas - $sub->dropdown(trans('admin/mainMenu.widgetAreas'), function ($sub) { - $sub->route('widgetareas.new', trans('admin/mainMenu.newWidgetArea'), [], 1, ['icon' => 'fa fa-fw fa-plus']); - $sub->route('widgetareas.overview', trans('admin/mainMenu.widgetAreaOverview'), [], 2, ['icon' => 'fa fa-fw fa-list']); - }, 50, ['icon' => 'fa fa-fw fa-object-group']); - }, 50, ['icon' => 'fa fa-fw fa-puzzle-piece']); + // menu for widget areas + if ($user->can('manage', WidgetArea::class)) { + $sub->dropdown(trans('admin/mainMenu.widgetAreas'), function ($sub) use ($user) { + if ($user->can('create', WidgetArea::class)) { + $sub->route('widgetareas.new', trans('admin/mainMenu.newWidgetArea'), [], 1, ['icon' => 'fa fa-fw fa-plus']); + } + $sub->route('widgetareas.overview', trans('admin/mainMenu.widgetAreaOverview'), [], 2, ['icon' => 'fa fa-fw fa-list']); + }, 50, ['icon' => 'fa fa-fw fa-object-group']); + } + }, 50, ['icon' => 'fa fa-fw fa-puzzle-piece']); + } /** * Divide system entries and other links in menu */ $menu->addDivider(9999); - $menu->dropdown(trans('admin/mainMenu.system'), function ($sub) { + $menu->dropdown(trans('admin/mainMenu.system'), function ($sub) use ($user) { /** * User management */ - $sub->dropdown(trans('admin/mainMenu.userManagement'), function ($sub) { - $sub->route('users.new', trans('admin/mainMenu.newUser'), [], 10, ['icon' => 'fa fa-fw fa-user-plus']); - $sub->route('users.overview', trans('admin/mainMenu.usersOverview'), [], 30, ['icon' => 'fa fa-fw fa-users']); - }, 20, ['icon' => 'fa fa-fw fa-users']); + if ($user->can('manage', User::class)) { + $sub->dropdown(trans('admin/mainMenu.userManagement'), function ($sub) use ($user) { + if ($user->can('create', User::class)) { + $sub->route('users.new', trans('admin/mainMenu.newUser'), [], 10, ['icon' => 'fa fa-fw fa-user-plus']); + } + $sub->route('users.overview', trans('admin/mainMenu.usersOverview'), [], 30, ['icon' => 'fa fa-fw fa-users']); + }, 20, ['icon' => 'fa fa-fw fa-users']); + } /** * Templates */ - $templatePaths = TemplatePathsHumanReadableRootOnly::getWithTranslations(); - if (!empty($templatePaths)) { - $sub->dropdown(trans('admin/mainMenu.templates'), function ($sub) use ($templatePaths) { - $i = 1; - foreach ($templatePaths as $id => $name) { - $sub->route('templates.overview', $name, ['id' => $id], $i++); - } - }, 60, ['icon' => 'fa fa-fw fa-file-code-o']); + if ($user->can('manage', Template::class)) { + $sub->route('templates.index', trans('admin/mainMenu.templates'), [], 70, ['icon' => 'fa fa-fw fa-file-code-o']); } - $sub->route('log.overview', trans('admin/mainMenu.actionLog'), [], 70, ['icon' => 'fa fa-fw fa-history']); - $sub->route('settings.overview', trans('admin/mainMenu.settings'), [], 80, ['icon' => 'fa fa-fw fa-gear']); + if ($user->can('manage', ActionLog::class)) { + $sub->route('log.overview', trans('admin/mainMenu.actionLog'), [], 70, ['icon' => 'fa fa-fw fa-history']); + } + + if ($user->can('manage', Settings::class)) { + $sub->route('settings.overview', trans('admin/mainMenu.settings'), [], 80, ['icon' => 'fa fa-fw fa-gear']); + $sub->route('permissions.index', trans('admin/mainMenu.permissions'), [], 90, ['icon' => 'fa fa-fw fa-key']); + } }, 10000, ['icon' => 'fa fa-fw fa-gears']); }); // create menu with user profile - \Menu::create('profileMenu', function ($menu) { - $menu->route('users.detail', trans('admin/userManagement.profile'), [], 10, ['icon' => 'fa fa-fw fa-user icon']); + \Menu::create('profileMenu', function ($menu) use ($user) { + $menu->route('users.detail', trans('admin/userManagement.profile'), ['user' => $user], 10, ['icon' => 'fa fa-fw fa-user icon']); $menu->addDivider(999); $menu->route('logout', trans('admin/common.logout'), [], 1000, ['icon' => 'fa fa-fw fa-power-off icon']); }); diff --git a/app/CMS/Handlers/History.php b/app/CMS/Handlers/History.php index c7d8973e..5f787e43 100644 --- a/app/CMS/Handlers/History.php +++ b/app/CMS/Handlers/History.php @@ -17,8 +17,7 @@ class History implements HistoryHandler switch ($changeset->column) { case 'pageContent': $route = route('history.diff', [ - 'revision' => $changeset->edit_batch, - 'id' => $changeset->id + 'revision' => $changeset->id ]); return "(" . trans('admin/history.diff') . ")"; @@ -48,8 +47,8 @@ class History implements HistoryHandler break; default: return trans('admin/history.changedFromTo', [ - 'from' => is_null($changeset->old_value) ? trans('admin/history.emptyValue') : $changeset->old_value, - 'to' => is_null($changeset->new_value) ? trans('admin/history.emptyValue') : $changeset->new_value, + 'from' => empty($changeset->old_value) ? trans('admin/history.emptyValue') : $changeset->old_value, + 'to' => empty($changeset->new_value) ? trans('admin/history.emptyValue') : $changeset->new_value, ]); break; } diff --git a/app/CMS/Handlers/Registrators/Items/SettingExtension.php b/app/CMS/Handlers/Registrators/Items/SettingExtension.php index f4d29bf1..c9d73335 100644 --- a/app/CMS/Handlers/Registrators/Items/SettingExtension.php +++ b/app/CMS/Handlers/Registrators/Items/SettingExtension.php @@ -15,6 +15,7 @@ class SettingExtension * @var string view used for rendering given settings part */ protected $view; + protected $order; /** * SettingExtension constructor. @@ -23,11 +24,12 @@ class SettingExtension * @param string $name * @param string $view */ - public function __construct($id, $name, $view) + public function __construct($id, $name, $view, $order) { $this->id = $id; $this->name = $name; $this->view = $view; + $this->order = $order; } /** @@ -53,4 +55,14 @@ class SettingExtension { return $this->view; } + + /** + * @return mixed + */ + public function getOrder() + { + return $this->order; + } + + } \ No newline at end of file diff --git a/app/CMS/Handlers/Registrators/SearchEngineRegistrator.php b/app/CMS/Handlers/Registrators/SearchEngineRegistrator.php index 09f35c54..a11edc15 100644 --- a/app/CMS/Handlers/Registrators/SearchEngineRegistrator.php +++ b/app/CMS/Handlers/Registrators/SearchEngineRegistrator.php @@ -1,7 +1,7 @@ checkIfRegistered($sectionId); + if (is_null($order)) { + $order = count($this->settingsExtensions); + } + // register new extension - $this->settingsExtensions[$sectionId] = new SettingExtension($sectionId, $sectionName, $sectionView); + $this->settingsExtensions[$sectionId] = new SettingExtension($sectionId, $sectionName, $sectionView, $order); } /** @@ -44,14 +49,15 @@ class SettingsExtensionRegistrator /** * Getter for all registered extensions - * * @return array */ public function get() { - // sort registered extensions by key - ksort($this->settingsExtensions); - + // sort registered extensions + uasort($this->settingsExtensions, function (SettingExtension $a, SettingExtension $b) { + return $a->getOrder() - $b->getOrder(); + }); + return $this->settingsExtensions; } diff --git a/app/CMS/Handlers/Registrators/TemplateRegistrator.php b/app/CMS/Handlers/Registrators/TemplateRegistrator.php index a9adfd73..e058137b 100644 --- a/app/CMS/Handlers/Registrators/TemplateRegistrator.php +++ b/app/CMS/Handlers/Registrators/TemplateRegistrator.php @@ -207,6 +207,7 @@ class TemplateRegistrator protected function registerTemplates($path, $templatePathId) { $templates = File::files($path); + $registeredTemplates = Templates::getWithTranslations(); foreach ($templates as $template) { @@ -217,7 +218,6 @@ class TemplateRegistrator // get all templates and template name (path/to/template.blade.php -> path.to.template) $templateName = $this->getTemplateName($template); - $registeredTemplates = Templates::getWithTranslations(); if (!in_array($templateName, $registeredTemplates)) { $params = [ @@ -316,4 +316,14 @@ class TemplateRegistrator return $this->namespace . trim($templateName, '.'); } + + public function deleteNonExistingPaths() + { + $paths = TemplatePath::all(); + + foreach ($paths as $path) { + if (!is_dir(base_path($path->path))) + \File::deleteDirectory($path->path); + } + } } diff --git a/app/CMS/Handlers/Search/Content.php b/app/CMS/Handlers/Search/Content.php index a4fbf4ed..66902633 100644 --- a/app/CMS/Handlers/Search/Content.php +++ b/app/CMS/Handlers/Search/Content.php @@ -1,7 +1,10 @@ cannot('manage', ContentModel::class)) { + return new Collection(); + } + $token = $this->tokenize($term); return ContentModel::where('pageContent', 'LIKE', $token) diff --git a/app/CMS/Handlers/Search/Files.php b/app/CMS/Handlers/Search/Files.php index 2833a7f2..5568b2be 100644 --- a/app/CMS/Handlers/Search/Files.php +++ b/app/CMS/Handlers/Search/Files.php @@ -1,7 +1,9 @@ cannot('manage', File::class)) { + return new Collection(); + } + $token = $this->tokenize($term); return File::where('original_filename', 'LIKE', $token) diff --git a/app/CMS/Handlers/Search/Presenters/AdminContent.php b/app/CMS/Handlers/Search/Presenters/AdminContent.php index 80768dc3..502c882f 100644 --- a/app/CMS/Handlers/Search/Presenters/AdminContent.php +++ b/app/CMS/Handlers/Search/Presenters/AdminContent.php @@ -3,11 +3,17 @@ namespace App\CMS\Handlers\Search\Presenters; use App\CMS\Enumerations\ContentStatuses; use App\CMS\Handlers\Contracts\SearchPresenterHandler; +use App\Models\Content\Content; class AdminContent implements SearchPresenterHandler { public function render($foundItems) { + if (\Auth::user() + ->cannot('manage', Content::class)) { + return null; + } + return view('admin.search.results.content', [ 'pages' => $foundItems, 'statuses' => ContentStatuses::getWithTranslations(), diff --git a/app/CMS/Handlers/Search/Presenters/AdminFiles.php b/app/CMS/Handlers/Search/Presenters/AdminFiles.php index 5869f731..00eebc3a 100644 --- a/app/CMS/Handlers/Search/Presenters/AdminFiles.php +++ b/app/CMS/Handlers/Search/Presenters/AdminFiles.php @@ -2,6 +2,7 @@ namespace App\CMS\Handlers\Search\Presenters; use App\CMS\Handlers\Contracts\SearchPresenterHandler; +use App\Models\FileManager\File; class AdminFiles implements SearchPresenterHandler { @@ -14,6 +15,11 @@ class AdminFiles implements SearchPresenterHandler */ public function render($foundItems) { + if (\Auth::user() + ->cannot('manage', File::class)) { + return null; + } + return view('admin.fileManager.filesTiles', ['files' => $foundItems, 'hideDelete' => true]); } } \ No newline at end of file diff --git a/app/CMS/Helpers/CurrentTemplate.php b/app/CMS/Helpers/CurrentTemplate.php index 070ce033..bc1f21ab 100644 --- a/app/CMS/Helpers/CurrentTemplate.php +++ b/app/CMS/Helpers/CurrentTemplate.php @@ -22,16 +22,9 @@ class CurrentTemplate implements TemplateHandler { if (!self::$initialized) { self::$template = Cache::rememberForever('current-template', function () { - $template = Module::where('is_template', true) + return Module::where('is_template', true) ->where('enabled', true) ->first(); - - // todo remove after adding $casts into Module model - if ($template) { - $template->module_settings = json_decode($template->module_settings); - } - - return $template; }); diff --git a/app/CMS/Helpers/PageRenderer.php b/app/CMS/Helpers/PageRenderer.php deleted file mode 100644 index bab9d042..00000000 --- a/app/CMS/Helpers/PageRenderer.php +++ /dev/null @@ -1,37 +0,0 @@ -moduleHandler; - - // render page - return $handler->render($page, $parameters); - } -} diff --git a/app/CMS/Helpers/Settings.php b/app/CMS/Helpers/Settings.php index dac28723..58f39a02 100644 --- a/app/CMS/Helpers/Settings.php +++ b/app/CMS/Helpers/Settings.php @@ -2,6 +2,7 @@ namespace App\CMS\Helpers; +use App\CMS\Repositories\Settings\Settings as SettingsRepository; use App\Models\Settings as SettingsModel; use Illuminate\Support\Facades\Cache; @@ -78,8 +79,7 @@ class Settings { if (!self::$initialized) { self::$settings = Cache::remember('settings', config('cache.settingCacheLifetime'), function () { - $model = new SettingsModel(); - return $model->getAll(); + return app(SettingsRepository::class)->getAll(); }); } } diff --git a/app/CMS/Helpers/WidgetAreas.php b/app/CMS/Helpers/WidgetAreas.php index 9b277701..907b721f 100644 --- a/app/CMS/Helpers/WidgetAreas.php +++ b/app/CMS/Helpers/WidgetAreas.php @@ -1,7 +1,8 @@ getWidgets($uniqueCode) ->get(); }); - WidgetArea::where('code', $uniqueCode) - ->increment('viewed'); - self::saveRenderedWidgetArea($widgets); } @@ -44,7 +43,7 @@ class WidgetAreas } $widgets = Cache::remember('widgets', setting('widgetCacheLifetime', 5), function () { - $widgetArea = new WidgetArea(); + $widgetArea = app(WidgetAreaRepository::class); return $widgetArea->getWidgets() ->get(); }); @@ -58,7 +57,7 @@ class WidgetAreas * * @param $uniqueCode * - * @return mixed + * @return void */ public static function render($uniqueCode) { @@ -72,4 +71,14 @@ class WidgetAreas echo isset(self::$widgetAreas[$uniqueCode]) ? self::$widgetAreas[$uniqueCode] : null; } + + /** + * Get list of loaded widgets and areas + * + * @return array + */ + public static function getLoadedWidgets() + { + return ['areas' => array_keys(self::$widgetAreas)]; + } } \ No newline at end of file diff --git a/app/CMS/Interactions/Admin/FileManager/CreateDirectory.php b/app/CMS/Interactions/Admin/FileManager/CreateDirectory.php index db6069cc..c7789759 100644 --- a/app/CMS/Interactions/Admin/FileManager/CreateDirectory.php +++ b/app/CMS/Interactions/Admin/FileManager/CreateDirectory.php @@ -31,22 +31,13 @@ class CreateDirectory implements Interaction { $data['parentDirectory'] = isset($data['parentDirectory']) ? $data['parentDirectory'] : null; - // todo this should probably go into validation, but we are not able to get $data in getValidationRules // check if created folder does not exist in current directory if ($this->repository->checkIfNameExists($data['name'], $data['parentDirectory'])) { throw new SubdirectoryExistsInDirectory(); } - // todo use Directory::create() and rename columns/fields in request // create new database entry - $directory = new Directory(); - $directory->name = $data['name']; - $directory->parent_id = $data['parentDirectory']; - $directory->user_id = \Auth::user()->id; - $directory->description = $data['description']; - $directory->save(); - - return $directory; + return $this->repository->create($data); } /** diff --git a/app/CMS/Interactions/Admin/FileManager/DeleteFile.php b/app/CMS/Interactions/Admin/FileManager/DeleteFile.php deleted file mode 100644 index e69de29b..00000000 diff --git a/app/CMS/Interactions/Admin/FileManager/EditDirectory.php b/app/CMS/Interactions/Admin/FileManager/EditDirectory.php deleted file mode 100644 index e69de29b..00000000 diff --git a/app/CMS/Interactions/Admin/FileManager/EditFileMetaInformation.php b/app/CMS/Interactions/Admin/FileManager/EditFileMetaInformation.php deleted file mode 100644 index e69de29b..00000000 diff --git a/app/CMS/Interactions/Admin/FileManager/UploadFile.php b/app/CMS/Interactions/Admin/FileManager/UploadFile.php deleted file mode 100644 index e69de29b..00000000 diff --git a/app/CMS/Interactions/Admin/FileManager/UploadFileRevision.php b/app/CMS/Interactions/Admin/FileManager/UploadFileRevision.php deleted file mode 100644 index e69de29b..00000000 diff --git a/app/CMS/MenuPresenters/FoundationDrilldownMenuPresenter.php b/app/CMS/MenuPresenters/FoundationDrilldownMenuPresenter.php index c20a59d6..7d24c744 100644 --- a/app/CMS/MenuPresenters/FoundationDrilldownMenuPresenter.php +++ b/app/CMS/MenuPresenters/FoundationDrilldownMenuPresenter.php @@ -1,8 +1,9 @@ getUrl() . '">' . $item->getIcon() . ' ' . $item->title . ''; - return 'getActiveState($item) . '>' . $link . ''.PHP_EOL; + return 'getActiveState($item) . '>' . $link . '' . PHP_EOL; } /** @@ -43,7 +44,7 @@ class FoundationDropdownMenuPresenter extends Presenter */ public function getDividerWrapper() { - return '
  • '.PHP_EOL; + return '
  • ' . PHP_EOL; } /** diff --git a/app/CMS/MenuPresenters/MetismenuPresenter.php b/app/CMS/MenuPresenters/MetismenuPresenter.php index 8bca5a84..a2f290e4 100644 --- a/app/CMS/MenuPresenters/MetismenuPresenter.php +++ b/app/CMS/MenuPresenters/MetismenuPresenter.php @@ -1,8 +1,9 @@ getUrl())) { + return null; + } + return 'getActiveState($item) . '>' . $item->getIcon() . ' ' . $item->title . '' . PHP_EOL; } diff --git a/app/CMS/MenuPresenters/ProfileMenuPresenter.php b/app/CMS/MenuPresenters/ProfileMenuPresenter.php index 255f0476..b0ce96b8 100644 --- a/app/CMS/MenuPresenters/ProfileMenuPresenter.php +++ b/app/CMS/MenuPresenters/ProfileMenuPresenter.php @@ -1,8 +1,9 @@ has_submodules = true; + $parentModule->save(); + } + + // insert module into database + $module = Module::create([ + 'name' => $name, + 'description' => $description, + 'handler' => $handler, + 'static_name' => $staticName, + 'manages_content' => $managesContent, + 'support_categories' => $supportCategories, + 'alias' => $alias, + 'module_settings' => $settings, + 'parent_id' => $parentModuleId ? $parentModuleId : null, + 'enabled' => 1, + 'is_template' => $isTemplate + ]); + + // install something module-specific + if ($handler && is_callable([$handler, 'install'])) { + call_user_func([$handler, 'install']); + } + + return $module; + } +} \ No newline at end of file diff --git a/app/CMS/ModuleManager/Providers/ModuleManager.php b/app/CMS/ModuleManager/Providers/ModuleManager.php new file mode 100644 index 00000000..73080e85 --- /dev/null +++ b/app/CMS/ModuleManager/Providers/ModuleManager.php @@ -0,0 +1,54 @@ +all(); + } catch (QueryException $e) { + return; + } + + // iterate over all modules and enable or disable them + foreach ($modules as $module) { + if (isset($module->module_settings['providers']) && !empty($module->module_settings['providers'])) { + foreach ($module->module_settings['providers'] as $provider) { + $this->app->register($provider); + } + } + + // include files (if any) + if (isset($module->module_settings['files']) && !empty($module->module_settings['files'])) { + foreach ($module->module_settings['files'] as $file) { + $path = config('modules.paths.modules') . '/' . $module->static_name . '/' . $file; + + if (!file_exists($path)) { + $path = base_path($file); + } + + @include_once $path; + } + } + } + } + + /** + * Register the application services. + * @return void + */ + public function register() + { + } +} diff --git a/app/CMS/ModuleManager/Uninstaller.php b/app/CMS/ModuleManager/Uninstaller.php new file mode 100644 index 00000000..1406cbe5 --- /dev/null +++ b/app/CMS/ModuleManager/Uninstaller.php @@ -0,0 +1,60 @@ +is_template) { + self::deleteDirectory(resource_path('views/visitor')); + self::deleteDirectory(resource_path('views/modules')); + self::deleteDirectory(public_path('assets')); + + // delete all template paths + TemplatePath::getQuery() + ->delete(); + } + + if ($module->handler && is_callable([$module->handler, 'uninstall'])) { + call_user_func([$module->handler, 'uninstall'], $module); + } + + $module->delete(); + } + + /** + * Delete directory when uninstalling module. + * + * @param $directory + * + * @throws \ErrorException + */ + private static function deleteDirectory($directory) + { + if (!is_dir($directory)) { + return; + } + + $success = \File::deleteDirectory($directory, true); + + if (!$success) { + throw new \ErrorException('Cannot delete ' . $directory); + } + } +} diff --git a/app/Providers/ModuleServiceProvider.php b/app/CMS/Modules/ServiceProviders/ServiceProvider.php similarity index 86% rename from app/Providers/ModuleServiceProvider.php rename to app/CMS/Modules/ServiceProviders/ServiceProvider.php index a121b014..f73a9f3a 100644 --- a/app/Providers/ModuleServiceProvider.php +++ b/app/CMS/Modules/ServiceProviders/ServiceProvider.php @@ -1,18 +1,19 @@ alias; }, \Config::get('view.paths')), [$sourcePath]), $this->alias); - if (is_dir($sourcePath)) { + if (is_dir($sourcePath) && $this->publishViews) { $this->publishes([$sourcePath => $viewPath], 'module-views'); } } /** * Register translations. - * * @return void */ protected function registerTranslations() diff --git a/app/CMS/Modules/Stubs/Migrations/create.stub b/app/CMS/Modules/Stubs/Migrations/create.stub new file mode 100644 index 00000000..4eba77e2 --- /dev/null +++ b/app/CMS/Modules/Stubs/Migrations/create.stub @@ -0,0 +1,27 @@ +increments('id'); + $table->timestamps(); + }); + } + + /** + * Rollback migration + */ + public function down() + { + Schema::dropIfExists('$TableName$'); + } +} \ No newline at end of file diff --git a/app/CMS/Modules/Stubs/Migrations/new.stub b/app/CMS/Modules/Stubs/Migrations/new.stub new file mode 100644 index 00000000..9d5b2fb1 --- /dev/null +++ b/app/CMS/Modules/Stubs/Migrations/new.stub @@ -0,0 +1,28 @@ + '$Module$', + 'translatedName' => '$module$::$module$.name', + 'translatedDescription' => '$module$::$module$.description', + 'alias' => strtolower('$Module$'), + 'handler' => \Modules\$Module$\Handlers\$Module$Handler::class, + 'providers' => [\Modules\$Module$\Providers\$Module$ServiceProvider::class], + 'files' => ['Http/routes.php'], + 'order' => 0, +]; \ No newline at end of file diff --git a/app/Policies/.gitkeep b/app/CMS/Modules/Stubs/NewModule/Database/Migrations/.gitkeep similarity index 100% rename from app/Policies/.gitkeep rename to app/CMS/Modules/Stubs/NewModule/Database/Migrations/.gitkeep diff --git a/app/CMS/Modules/Stubs/NewModule/Entities/$Entity$.stub b/app/CMS/Modules/Stubs/NewModule/Entities/$Entity$.stub new file mode 100644 index 00000000..9676203a --- /dev/null +++ b/app/CMS/Modules/Stubs/NewModule/Entities/$Entity$.stub @@ -0,0 +1,10 @@ +dropdown(trans('$module$::$module$.name'), function ($submenu) use ($user) { + $submenu->route('$module$.overview', trans('$module$::$module$.overview'), [], 20, ['icon' => 'fa fa-fw fa-list']); + $submenu->route('$module$.new', trans('$module$::$module$.new'), [], 21, ['icon' => 'fa fa-fw fa-plus']); + }, 15, ['icon' => 'fa fa-fw']); + + + + // TODO: add admin menu entries + } + + /** + * Does this module support categories? + * @return boolean + */ + public static function supportCategories() + { + return true; + } +} \ No newline at end of file diff --git a/app/CMS/Modules/Stubs/NewModule/Http/Controllers/Admin/$Module$.stub b/app/CMS/Modules/Stubs/NewModule/Http/Controllers/Admin/$Module$.stub new file mode 100644 index 00000000..bada410e --- /dev/null +++ b/app/CMS/Modules/Stubs/NewModule/Http/Controllers/Admin/$Module$.stub @@ -0,0 +1,103 @@ +$module$Repository = $$module$Repository; + } + + /** + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function index() + { + $items = $Entity$Entity::all(); + + return view('$module$::admin/index', compact('items')); + } + + /** + * Display form for updating entity + * + * @param $Entity$Entity $entity + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function edit($Entity$Entity $entity) + { + return view('$module$::admin/update', compact('entity')); + } + + /** + * Update existing entity + * + * @param Update$Entity$ $request + * @param $Entity$Entity $item + * + * @return \Illuminate\Http\RedirectResponse + */ + public function update(Update$Entity$ $request, $Entity$Entity $entity) + { + + // ... + + $this->$module$Repository->update($entity, $request->all()); + + return redirect() + ->back() + ->with('success', trans('$module$.$module.successfullyUpdated')); + } + + /** + * Display form for creating new entity + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function create() { + $entity = new $Entity$Entity(); + + return view('$module$::admin/create', compact('entity')); + } + + /** + * Create new instance of entity + */ + public function store(Create$Entity$ $request) { + // ... + + $this->$module$Repository->create($request->all()); + + return redirect() + ->back() + ->with('success', trans('$module$.$module.successfullyUpdated')); + } + + /** + * Delete entity + * + * @param $Entity$ $entity + * + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy($Entity$ $entity) { + $entity->delete(); + + return redirect() + ->back() + ->with('success', trans('$module$.$module.successfullyDeleted')); + } +} \ No newline at end of file diff --git a/app/CMS/Modules/Stubs/NewModule/Http/Requests/Create$Entity$.stub b/app/CMS/Modules/Stubs/NewModule/Http/Requests/Create$Entity$.stub new file mode 100644 index 00000000..f79dcc59 --- /dev/null +++ b/app/CMS/Modules/Stubs/NewModule/Http/Requests/Create$Entity$.stub @@ -0,0 +1,11 @@ + \LaravelLocalization::setLocale() . '/admin/$module$', + 'middleware' => ['admin'], + 'namespace' => 'Modules\$Module$\Http\Controllers\Admin' + ], function () { + Route::get('/', '$Module$@index') + ->name('$module$.overview'); + + Route::get('/new', '$Module$@create') + ->name('$module$.new'); + + Route::post('/new', '$Module$@store') + ->name('$module$.postNew'); + + Route::get('/edit/{id}', '$Module$@edit') + ->name('$module$.edit'); + + Route::post('/edit/{id}', '$Module$@update') + ->name('$module$.postEdit'); + + Route::get('/delete/{id}', '$Module$@delete') + ->name('$module$.delete'); +}); \ No newline at end of file diff --git a/app/CMS/Modules/Stubs/NewModule/Providers/$Module$ServiceProvider.stub b/app/CMS/Modules/Stubs/NewModule/Providers/$Module$ServiceProvider.stub new file mode 100644 index 00000000..60fb3266 --- /dev/null +++ b/app/CMS/Modules/Stubs/NewModule/Providers/$Module$ServiceProvider.stub @@ -0,0 +1,31 @@ +alias = strtolower('$module$'); + } + + /** + * Set path to module + */ + protected function setModulePath() + { + $this->path = __DIR__; + } +} \ No newline at end of file diff --git a/app/CMS/Modules/Stubs/NewModule/Repositories/$Module$Repository.stub b/app/CMS/Modules/Stubs/NewModule/Repositories/$Module$Repository.stub new file mode 100644 index 00000000..a835994f --- /dev/null +++ b/app/CMS/Modules/Stubs/NewModule/Repositories/$Module$Repository.stub @@ -0,0 +1,24 @@ +update($data); + } +} \ No newline at end of file diff --git a/app/CMS/Modules/Stubs/NewModule/Resources/lang/cs/$module$.stub b/app/CMS/Modules/Stubs/NewModule/Resources/lang/cs/$module$.stub new file mode 100644 index 00000000..18238f41 --- /dev/null +++ b/app/CMS/Modules/Stubs/NewModule/Resources/lang/cs/$module$.stub @@ -0,0 +1,13 @@ + '$Module$', + 'new' => 'Vytvořit nový', + 'description' => '', + 'successfullyUpdated' => 'Úspěšně upraveno.', + 'successfullyCreated' => 'Úspěšně vytvořeno.', + 'successfullyDeleted' => 'Úspěšně smazáno.', + 'overview' => 'Přehled', + 'noItems' => 'Žádná data.', + 'save' => 'Uložit' +]; \ No newline at end of file diff --git a/app/CMS/Modules/Stubs/NewModule/Resources/views/admin/create.blade.stub b/app/CMS/Modules/Stubs/NewModule/Resources/views/admin/create.blade.stub new file mode 100644 index 00000000..e7d1aa6f --- /dev/null +++ b/app/CMS/Modules/Stubs/NewModule/Resources/views/admin/create.blade.stub @@ -0,0 +1,7 @@ +@extends('admin.layoutWithNavigation') + +@section('pageHeading', @trans('$module$::$module$.name')) + +@section('content') + @include('$module$::admin/form', ['action' => route('$module$.new')]) +@endsection \ No newline at end of file diff --git a/app/CMS/Modules/Stubs/NewModule/Resources/views/admin/edit.blade.stub b/app/CMS/Modules/Stubs/NewModule/Resources/views/admin/edit.blade.stub new file mode 100644 index 00000000..6b8bd1ff --- /dev/null +++ b/app/CMS/Modules/Stubs/NewModule/Resources/views/admin/edit.blade.stub @@ -0,0 +1,7 @@ +@extends('admin.layoutWithNavigation') + +@section('pageHeading', @trans('$module$::$module$.name')) + +@section('content') + @include('$module$::admin/form', ['action' => route('$module$.update')]) +@endsection \ No newline at end of file diff --git a/app/CMS/Modules/Stubs/NewModule/Resources/views/admin/form.blade.stub b/app/CMS/Modules/Stubs/NewModule/Resources/views/admin/form.blade.stub new file mode 100644 index 00000000..f422b7d9 --- /dev/null +++ b/app/CMS/Modules/Stubs/NewModule/Resources/views/admin/form.blade.stub @@ -0,0 +1,6 @@ +
    + + {{--...--}} + + +
    \ No newline at end of file diff --git a/app/CMS/Modules/Stubs/NewModule/Resources/views/admin/index.blade.stub b/app/CMS/Modules/Stubs/NewModule/Resources/views/admin/index.blade.stub new file mode 100644 index 00000000..817e62e0 --- /dev/null +++ b/app/CMS/Modules/Stubs/NewModule/Resources/views/admin/index.blade.stub @@ -0,0 +1,17 @@ +@extends('admin.layoutWithNavigation') + +@section('pageHeading', @trans('$module$::$module$.overview')) + +@section('content') + @if (!empty($items)) + + @foreach($items as $item) + + @endforeach +
    + @else +
    + @trans('$module$::$module$.noItems') +
    + @endif +@endsection \ No newline at end of file diff --git a/app/CMS/Pipeline/SavePipeline/Process/UploadRelatedFiles.php b/app/CMS/Pipeline/SavePipeline/Process/UploadRelatedFiles.php index 447897f0..2fb245f2 100644 --- a/app/CMS/Pipeline/SavePipeline/Process/UploadRelatedFiles.php +++ b/app/CMS/Pipeline/SavePipeline/Process/UploadRelatedFiles.php @@ -1,4 +1,5 @@ join('modules', 'modules.handler', '=', 'contents.moduleHandler') ->join('users', 'users.id', '=', 'contents.userId') - ->addSelect(DB::raw('COALESCE(users.name, users.email) AS author_name')) - ->addSelect('users.email AS author_email') ->whereNull('contents.deleted_at') + ->whereNull('contents.parentId') ->where('contents.language', LaravelLocalization::getCurrentLocale()) ->where('modules.enabled', 1) + ->with('module', 'subpages', 'subpages.module', 'subpages.templateModel', 'templateModel') + ->orderBy('contents.order') ->orderBy('contents.created_at', 'DESC'); // filter results using handler diff --git a/app/CMS/Repositories/FileManager/Directory.php b/app/CMS/Repositories/FileManager/Directory.php index 0e6250ec..1d697270 100644 --- a/app/CMS/Repositories/FileManager/Directory.php +++ b/app/CMS/Repositories/FileManager/Directory.php @@ -1,4 +1,5 @@ exists(); } - public function update(DirectoryModel $directory, $data) { + /** + * Create new directory + * + * @param $data + * + * @return DirectoryModel + */ + public function create($data) + { + $directory = new DirectoryModel(); + $directory->name = $data['name']; + $directory->parent_id = $data['parentDirectory']; + $directory->user_id = \Auth::user()->id; + $directory->description = $data['description']; + $directory->save(); + + return $directory; + } + + /** + * Update given directory + * + * @param DirectoryModel $directory + * @param $data + */ + public function update(DirectoryModel $directory, $data) + { $directory->name = $data['name']; $directory->description = $data['description']; $directory->save(); diff --git a/app/CMS/Repositories/FileManager/File.php b/app/CMS/Repositories/FileManager/File.php new file mode 100644 index 00000000..23ffaaef --- /dev/null +++ b/app/CMS/Repositories/FileManager/File.php @@ -0,0 +1,16 @@ +update($data); + } +} \ No newline at end of file diff --git a/app/CMS/Repositories/Module.php b/app/CMS/Repositories/Module.php index b8320d39..93d9fcb9 100644 --- a/app/CMS/Repositories/Module.php +++ b/app/CMS/Repositories/Module.php @@ -1,9 +1,11 @@ where('manages_content', true) + ->get(); + }); + } + public function getCreateContentTitle(ModuleModel $module) { $pageHeading = trans('admin/contents.new', ['name' => trans($module->name)]); @@ -42,9 +53,14 @@ class Module extends Repository implements IModule return is_null($moduleHeading) ? $pageHeading : $moduleHeading; } - public function getOverviewTitle(ModuleModel $module) + public function getOverviewTitle(ModuleModel $module = null) { $pageHeading = 'admin/contents.overview'; + + if (is_null($module)) { + return $pageHeading; + } + $moduleHeading = $this->call($module, 'getOverviewTitle'); return is_null($moduleHeading) ? $pageHeading : $moduleHeading; @@ -52,8 +68,19 @@ class Module extends Repository implements IModule public function all() { - return ModuleModel::where('enabled', true) - ->get(); + return Cache::remember('enabled-modules-and-template', setting('cacheModules', 3600), function () { + return ModuleModel::where('enabled', true) + ->get(); + }); + } + + public function getOnlyModules() + { + return Cache::remember('enabled-modules', setting('cacheModules', 3600), function () { + return ModuleModel::where('enabled', true) + ->where('is_template', false) + ->get(); + }); } public function getByHandler($handler) diff --git a/app/CMS/Repositories/Permissions/Permission.php b/app/CMS/Repositories/Permissions/Permission.php new file mode 100644 index 00000000..f77952c6 --- /dev/null +++ b/app/CMS/Repositories/Permissions/Permission.php @@ -0,0 +1,15 @@ +with('subpermissions') + ->get(); + } +} \ No newline at end of file diff --git a/app/Models/ModelTraits/Settings.php b/app/CMS/Repositories/Settings/Settings.php similarity index 59% rename from app/Models/ModelTraits/Settings.php rename to app/CMS/Repositories/Settings/Settings.php index 841c6125..fe680c5d 100644 --- a/app/Models/ModelTraits/Settings.php +++ b/app/CMS/Repositories/Settings/Settings.php @@ -1,27 +1,27 @@ where('language', LaravelLocalization::getCurrentLocale()) - ->orWhere('language', null) - ->orderBy('language', 'ASC'); + ->where('language', LaravelLocalization::getCurrentLocale()) + ->orWhere('language', null) + ->orderBy('language', 'ASC'); } /** * Load all settings - * * @return \stdClass */ public function getAll() @@ -34,7 +34,6 @@ trait Settings /** * Get all settings with language info - * * @return \stdClass */ public function getAllWithLanguage() @@ -55,7 +54,6 @@ trait Settings /** * Load only config for views - * * @return \stdClass */ public function getForView() @@ -83,4 +81,31 @@ trait Settings return $data; } + + /** + * Save settings + * + * @param array $data + */ + public function save(array $data) + { + $commonSettings = isset($data['commonSettings']) ? $data['commonSettings'] : []; + unset($data['commonSettings']); + + foreach ($data as $key => $value) { + // select language for this setting key + $language = isset($commonSettings[$key]) ? null : LaravelLocalization::getCurrentLocale(); + $setting = SettingsModel::firstOrNew(['language' => $language, 'key' => $key]); + + if ($setting->value == $value) { + continue; + } + + // set value and save or delete + $setting->value = $value; + empty($value) ? $setting->delete() : $setting->save(); + } + + Cache::forget('settings'); + } } \ No newline at end of file diff --git a/app/CMS/Repositories/Templates/Template.php b/app/CMS/Repositories/Templates/Template.php index dff25732..fdb0bcfd 100644 --- a/app/CMS/Repositories/Templates/Template.php +++ b/app/CMS/Repositories/Templates/Template.php @@ -1,10 +1,12 @@ id) - ->select(['template_name', 'name', 'description']) - ->get(); + return Cache::remember('templates-for-module-'.$module->id, setting('cacheModules', 3600), function () use ($module) { + return TemplateModel::where('module_id', $module->id) + ->select(['template_name', 'name', 'description']) + ->get(); + }); } } \ No newline at end of file diff --git a/app/CMS/Repositories/Users/User.php b/app/CMS/Repositories/Users/User.php new file mode 100644 index 00000000..f4c6d7df --- /dev/null +++ b/app/CMS/Repositories/Users/User.php @@ -0,0 +1,65 @@ +username = $data['username']; + } + + // change name (if set) + if (isset($data['name'])) { + $user->name = $data['name']; + } + + if (isset($data['role'])) { + $user->role = $data['role']; + } + + if (isset($data['status'])) { + $user->status = $data['status']; + } + + if (isset($data['password'])) { + $user->password = Hash::make($data['password']); + } + + $user->email = $data['email']; + + $user->save(); + } + + /** + * Create new user + * + * @param $data + * + * @return UserModel + */ + public function create($data) + { + // create new user + $user = new UserModel(); + $user->name = $data['name']; + $user->email = $data['email']; + $user->username = $data['username']; + $user->role = $data['role']; + $user->password = Hash::make($data['password']); + + // store user into database + $user->save(); + + return $user; + } +} \ No newline at end of file diff --git a/app/CMS/Repositories/Widgets/Widget.php b/app/CMS/Repositories/Widgets/Widget.php index bb924ce4..84299373 100644 --- a/app/CMS/Repositories/Widgets/Widget.php +++ b/app/CMS/Repositories/Widgets/Widget.php @@ -1,4 +1,5 @@ description = $data['description']; $widget->container_class = $data['containerClass']; $widget->container_id = empty($data['containerId']) ? null : $data['containerId']; - $widget->settings = json_encode(call_user_func([$widgetType->handler, 'save'], $request)); + $widget->settings = call_user_func([$widgetType->handler, 'save'], $request); // save into database $widget->save(); @@ -30,4 +31,22 @@ class Widget return $widget; } + + public function edit(WidgetModel $widget, Request $request) + { + // update name + $widget->name = $request->name; + $widget->container_class = $request->containerClass; + $widget->container_id = empty($request->containerId) ? null : $request->containerId; + $widget->description = $request->description; + + // try to save this widget + $widget->settings = call_user_func([$widget->widget_type_handler, 'save'], $request); + + // save into database + $widget->save(); + + // fire event with editing widget + Event::fire(new \App\Events\EditWidget($widget)); + } } \ No newline at end of file diff --git a/app/CMS/Repositories/Widgets/WidgetArea.php b/app/CMS/Repositories/Widgets/WidgetArea.php new file mode 100644 index 00000000..a278549f --- /dev/null +++ b/app/CMS/Repositories/Widgets/WidgetArea.php @@ -0,0 +1,55 @@ +join('widget_in_widget_area', 'widget_in_widget_area.widget_id', '=', 'widgets.id') + ->join('widget_areas', 'widget_in_widget_area.widget_area_id', '=', 'widget_areas.id') + ->where('language', LaravelLocalization::getCurrentLocale()) + ->orderBy('widget_in_widget_area.position'); + if (!$uniqueCode) { + $widgets = $widgets->where('widget_areas.viewed', '>=', setting('preloadFrequentedWidgetAreasTreshold', 10)); + } else { + $widgets = $widgets->where('code', $uniqueCode); + } + + return $widgets; + } + + public function update(\App\Models\Widgets\WidgetArea $area, Request $request) { + $area->name = $request->name; + $area->description = $request->description; + $area->save(); + + // fire event with new widget area + Event::fire(new \App\Events\EditWidgetArea($area)); + } + + /** + * Create new instance of widget area + * + * @param Request $request + */ + public function create(Request $request) + { + $area = WidgetAreaModel::create([ + 'code' => $request->code, + 'name' => $request->name, + 'description' => $request->description + ]); + + // fire event with new widget area + Event::fire(new CreateNewWidgetArea($area)); + } +} \ No newline at end of file diff --git a/app/CMS/Widgets/Menu/Menu.php b/app/CMS/Widgets/Menu/Menu.php index 21cf66e9..4d4bb697 100644 --- a/app/CMS/Widgets/Menu/Menu.php +++ b/app/CMS/Widgets/Menu/Menu.php @@ -1,19 +1,21 @@ whereIn('id', $ids) - ->whereIn('status', $allowedStatuses) - ->get(); - $used = []; - foreach ($pages as $page) { - $used[$page->id] = $page; - } + return Cache::remember('widget-menu-content-pages', 5, function () use ($ids, $allowedStatuses) { + $pages = Content::where('language', LaravelLocalization::getCurrentLocale()) + ->whereIn('id', $ids) + ->whereIn('status', $allowedStatuses) + ->where('moduleHandler', '!=', Article::class) + ->get(); - return $used; + $used = []; + foreach ($pages as $page) { + $used[$page->id] = $page; + } + + return $used; + }); } } \ No newline at end of file diff --git a/app/CMS/Widgets/Menu/Presenters/Menu.php b/app/CMS/Widgets/Menu/Presenters/Menu.php index 7a1ccb02..aa6b9cb3 100644 --- a/app/CMS/Widgets/Menu/Presenters/Menu.php +++ b/app/CMS/Widgets/Menu/Presenters/Menu.php @@ -1,4 +1,5 @@ getOverview(); - $widget->settings = new \stdClass(); - $widget->settings->links = []; + $pages = $content->getOverview() + ->get(); return view('admin.widgets.menu.new', [ 'type' => $type, 'widget' => $widget, 'pages' => $pages, + 'links' => [] ]); } @@ -122,8 +123,6 @@ class Menu implements WidgetRenderer return $a->order - $b->order; }); - $widget->settings->links = (object)$links; - - return view('admin.widgets.menu.edit', ['widget' => $widget, 'pages' => $pages]); + return view('admin.widgets.menu.edit', ['widget' => $widget, 'pages' => $pages, 'links' => (object)$links]); } } \ No newline at end of file diff --git a/app/Console/Commands/ChangePassword.php b/app/Console/Commands/ChangePassword.php index d8ab70a9..bb0789a8 100644 --- a/app/Console/Commands/ChangePassword.php +++ b/app/Console/Commands/ChangePassword.php @@ -30,7 +30,7 @@ class ChangePassword extends Command $email = $this->argument('email'); try { $user = User::where(['email' => $email]) - ->first(); + ->firstOrFail(); } catch (ModelNotFoundException $e) { $this->error('Invalid user ' . $email . '.'); return; diff --git a/app/Console/Commands/InitDatabaseSchema.php b/app/Console/Commands/InitDatabaseSchema.php index af8c11c0..ebeb91d6 100644 --- a/app/Console/Commands/InitDatabaseSchema.php +++ b/app/Console/Commands/InitDatabaseSchema.php @@ -13,14 +13,14 @@ class InitDatabaseSchema extends Command * * @var string */ - protected $signature = 'db:init {schema.sql}'; + protected $signature = 'db:init'; /** * The console command description. * * @var string */ - protected $description = 'Command description'; + protected $description = 'Init database structure'; /** * Create a new command instance. @@ -39,13 +39,16 @@ class InitDatabaseSchema extends Command */ public function handle() { + do { + $schema = $this->ask('Path to database schema file', 'database/schema.sql'); + } while (!file_exists($schema)); - $schema = $this->argument('schema.sql'); - - if (!file_exists($schema)) throw new NotFoundHttpException('File '.$schema.' does not exist.'); DB::unprepared(file_get_contents($schema)); - $this->line('Successfully imported'); + $this->call('migrate'); + $this->call('db:seed'); + + $this->line('Database successfully initialized.'); } } diff --git a/app/Console/Commands/InstallCMS.php b/app/Console/Commands/InstallCMS.php new file mode 100644 index 00000000..f7819089 --- /dev/null +++ b/app/Console/Commands/InstallCMS.php @@ -0,0 +1,153 @@ +createEnv(); + + $this->line('Rerun this script again, we need to load changes.'); + return; + } + + // install php dependencies + $parameters = env('APP_DEBUG') ? '' : '--no-dev'; + exec('composer install ' . $parameters); + + // init database + try { + // does exist something in laguages table? (Or event table itself?) + Language::all(); + } catch (QueryException $e) { + // database is not initialized + $this->call('db:init'); + } + + // install npm dependencies + exec('npm install'); + exec('bower install'); + exec('gulp'); + + // change chmod of needed directories + $directories = ['bootstrap/cache', 'storage', 'public']; + foreach ($directories as $directory) { + $this->changeChmod($directory); + } + $this->line('Chmod changed'); + + // generate APP_KEY in .env + $this->call('key:generate'); + + // create user + $this->line('Creating admin user...'); + do { + $email = $this->ask('E-mail for admin user'); + } while (empty($email)); + + $this->call('user:new', compact('email')); + + $this->line('All done. CMS should be prepared.'); + } + + /** + * Insert value into .env config file + * + * @param $envConstant + * @param $value + */ + private function setEnvConstant($envConstant, $value) + { + $content = file_get_contents(base_path('.env')); + $content = preg_replace('/' . $envConstant . '=(.*)/i', $envConstant . '=' . $value, $content); + file_put_contents(base_path('.env'), $content); + } + + /** + * Create .env file with all needed constants + */ + private function createEnv() + { + \File::copy(base_path('.env.example'), base_path('.env')); + + // set environment + do { + $env = $this->ask('Install environment: ', 'local'); + } while (empty($env)); + $this->setEnvConstant('APP_ENV', $env); + + // set debugging + if ($env == 'local') { + $debug = 'true'; + } else { + $debug = $this->confirm('Enable debugging?', true) ? 'true' : 'false'; + } + $this->setEnvConstant('APP_DEBUG', $debug); + + // setup database + $databaseFields = [ + 'DB_HOST' => 'Database server', + 'DB_DATABASE' => 'Database name', + 'DB_USERNAME' => 'Database user', + 'DB_PASSWORD' => 'Password' + ]; + foreach ($databaseFields as $constant => $text) { + do { + $value = $this->ask($text); + } while (empty ($value)); + + $this->setEnvConstant($constant, $value); + } + + // set app url + do { + $url = $this->ask('Application URL'); + $url = trim($url, ' /'); + } while (empty($url)); + $this->setEnvConstant('SITE_URL', $url); + $this->setEnvConstant('UPLOAD_URL', $url . '/public/uploads'); + $this->setEnvConstant('THUMBNAIL_URL', $url . '/public/uploads/thumbnails'); + } + + /** + * Recursively change chmod to 777 in given directory + * + * @param $directory + */ + private function changeChmod($directory) + { + @chmod($directory, 0777); + + if (!is_dir($directory)) { + return; + } + + $subdirectories = \File::allFiles($directory); + + foreach ($subdirectories as $subdirectory) { + $this->changeChmod($subdirectory); + } + } +} diff --git a/app/Console/Commands/Modules/CreateMigration.php b/app/Console/Commands/Modules/CreateMigration.php new file mode 100644 index 00000000..1f42ce11 --- /dev/null +++ b/app/Console/Commands/Modules/CreateMigration.php @@ -0,0 +1,106 @@ +moduleName = $module = $this->argument('module'); + $this->migrationName = $name = $this->argument('name'); + $this->tableName = trim($this->option('table'), ' ='); + + $modules = Module::where('enabled', true) + ->get() + ->pluck('static_name', 'id') + ->toArray(); + + while (is_null($module) || !in_array($module, $modules)) { + $module = $this->anticipate('Input valid module name', $modules); + } + + $selectedModule = Module::where('static_name', $module) + ->first(); + + $basePath = $selectedModule->is_template ? config('modules.path.template') : config('modules.paths.modules'); + $path = $basePath . '/' . $module . '/Database/Migrations/'; + if (!is_dir($path)) { + mkdir($path, 0777, true); + } + + while (is_null($name)) { + $this->migrationName = $name = $this->ask('Input migration name'); + } + + $stubName = $this->option('create') ? 'create' : 'new'; + $content = file_get_contents(config('modules.paths.stubs') . '/Migrations/' . $stubName . '.stub'); + $content = $this->replacePlaceholders($content); + + $migrationName = $path . $this->getMigrationName($name); + + file_put_contents($migrationName, $content); + + $this->line('Migration successfully created.', 'info'); + } + + /** + * Find and replace all placeholders in given content + * + * @param $content + * + * @return mixed + */ + private function replacePlaceholders($content) + { + $replace = [ + '$MigrationName$' => studly_case($this->migrationName), + '$ModuleName$' => $this->moduleName, + '$TableName$' => $this->tableName + ]; + + foreach ($replace as $what => $for) { + $content = str_replace($what, $for, $content); + } + + return $content; + } + + /** + * Get prefix for created migration + * @return false|string + */ + protected function getDatePrefix() + { + return date('Y_m_d_His'); + } + + /** + * @param $name + * + * @return string + */ + private function getMigrationName($name) + { + return $this->getDatePrefix() . '_' . snake_case($name) . '.php'; + } +} diff --git a/app/Console/Commands/Modules/CreateNew.php b/app/Console/Commands/Modules/CreateNew.php new file mode 100644 index 00000000..7a86e653 --- /dev/null +++ b/app/Console/Commands/Modules/CreateNew.php @@ -0,0 +1,122 @@ +loadArguments(); + $path = preg_replace('|/{2,}|i', '/', config('modules.paths.modules') . '/' . $this->moduleNamespace); + + if (is_dir($path)) { + $this->error('Module already exists in ' . $path); + return; + } + + if (!is_dir($path)) + mkdir($path); + + // copy stub files + \File::copyDirectory(config('modules.paths.stubs').'/NewModule', $path); + + $files = \File::allFiles($path); + foreach ($files as $file) { + $newName = str_replace('stub', 'php', $this->replacePlaceholders($file->getPathname())); + + // ignore new entity when using existing entity + if ($this->entityNamespace != $defaultEntityNamespace && Str::contains('Entities', $file)) { + \File::delete($file); + continue; + } + + // rename file + \File::move($file, $newName); + + // change its content + $content = file_get_contents($newName); + $content = $this->replacePlaceholders($content); + file_put_contents($newName, $content); + } + + $this->info('Module successfully created.'); + + $this->call('module:install', ['name' => $this->moduleName]); + + } + + /** + * Find and replace all placeholders in given content + * + * @param $content + * + * @return mixed + */ + private function replacePlaceholders($content) + { + $replace = [ + '$Module$' => $this->moduleName, + '$ModuleNamespace$' => str_replace('/', '\\', $this->moduleNamespace), + '$module$' => strtolower($this->moduleName), + '$EntityNamespace$' => $this->entityNamespace, + '$Entity$' => $this->entity + ]; + + foreach ($replace as $what => $for) { + $content = str_replace($what, $for, $content); + } + + return $content; + } + + /** + * Load command arguments + * @return string + */ + private function loadArguments() + { + $parent = $this->argument('parentModule'); + $this->moduleName = $moduleName = $this->argument('name'); + $this->moduleNamespace = trim($parent . '/' . $moduleName, '/'); + + $entity = $this->option('entity'); + + $defaultEntityNamespace = '\\Modules\\' . str_replace('/', '\\', $this->moduleNamespace) . '\Entities\\'; + + if (!empty($entity)) { + $parts = explode('\\', $entity); + $this->entity = $parts[count($parts) - 1]; + unset($parts[count($parts) - 1]); + $this->entityNamespace = implode('\\', $parts); + } else { + $this->entityNamespace = $defaultEntityNamespace; + $this->entity = $this->moduleName; + } + + return $defaultEntityNamespace; + } +} \ No newline at end of file diff --git a/app/Console/Commands/Modules/DisableModule.php b/app/Console/Commands/Modules/DisableModule.php new file mode 100644 index 00000000..2e5b1aa7 --- /dev/null +++ b/app/Console/Commands/Modules/DisableModule.php @@ -0,0 +1,48 @@ +argument('module'); + $module = Module::where('static_name', $moduleName) + ->firstOrFail(); + + if ($module->has_submodules) { + $submodules = $module->submodules; + + foreach ($submodules as $submodule) { + $this->call('module:disable', ['module' => $submodule->static_name]); + } + } + + $module->enabled = false; + $module->save(); + + \Cache::forget('enabled-modules'); + \Cache::forget('enabled-content-modules'); + \Cache::forget('enabled-modules-and-template'); + + $this->line('Module ' . $module->static_name . ' disabled.'); + } +} diff --git a/app/Console/Commands/Modules/EnableModule.php b/app/Console/Commands/Modules/EnableModule.php new file mode 100644 index 00000000..c1ddba27 --- /dev/null +++ b/app/Console/Commands/Modules/EnableModule.php @@ -0,0 +1,52 @@ +argument('module'); + $module = Module::where('static_name', $moduleName) + ->firstOrFail(); + + if ($module->has_submodules) { + $submodules = $module->submodules; + + foreach ($submodules as $submodule) { + $this->call('module:enable', ['module' => $submodule->static_name]); + } + } + + if ($module->parent_id) { + $module->parent->update(['enabled' => true]); + } + + $module->enabled = true; + $module->save(); + + \Cache::forget('enabled-modules'); + \Cache::forget('enabled-content-modules'); + \Cache::forget('enabled-modules-and-template'); + + $this->line('Module ' . $module->static_name . ' enabled.'); + } +} diff --git a/app/Console/Commands/InstallAllModules.php b/app/Console/Commands/Modules/InstallAllModules.php similarity index 75% rename from app/Console/Commands/InstallAllModules.php rename to app/Console/Commands/Modules/InstallAllModules.php index 50f53ac7..36e0f7e2 100644 --- a/app/Console/Commands/InstallAllModules.php +++ b/app/Console/Commands/Modules/InstallAllModules.php @@ -1,6 +1,6 @@ call('install-module', ['name' => $moduleName]); + $this->call('module:install', ['name' => $moduleName]); } catch (\Exception $e) { $this->line('Module ' . $moduleName . ' already installed.'); } diff --git a/app/Console/Commands/InstallModule.php b/app/Console/Commands/Modules/InstallModule.php similarity index 87% rename from app/Console/Commands/InstallModule.php rename to app/Console/Commands/Modules/InstallModule.php index 5bf435e5..3f2836c3 100644 --- a/app/Console/Commands/InstallModule.php +++ b/app/Console/Commands/Modules/InstallModule.php @@ -1,7 +1,8 @@ loadConfig(); - if (empty($config)) + if (empty($config)) { return; + } // check if it is valid $this->checkMandatoryFields($config); @@ -68,14 +67,15 @@ class InstallModule extends Command Cache::forget('enabled-modules'); Cache::forget('module-handler-to-id-enumeration'); + exec('composer dump-autoload'); + // inform user - $this->line('Module ' . $name . ' successfuly installed'); + $this->line('Module ' . $name . ' successfuly installed.'); } /** * Load config from Config/config.php in module files. We cannot use config() because the file have not published * yet. - * * @return array * @throws FileNotFoundException */ @@ -84,8 +84,9 @@ class InstallModule extends Command $basePath = $this->modulesPath . DIRECTORY_SEPARATOR . $this->moduleName . DIRECTORY_SEPARATOR; $path = $basePath . 'Config' . DIRECTORY_SEPARATOR . 'config.php'; - if (basename($basePath) == 'Database') + if (basename($basePath) == 'Database') { return []; + } // check if module has Config/config.php file if (!file_exists($path)) { @@ -120,7 +121,6 @@ class InstallModule extends Command /** * Installs module into database. - * * This method calls Module::install, which handles specific installation of module. In this way we should be able * to install any module even with some other database structures. * @@ -154,14 +154,12 @@ class InstallModule extends Command if (is_null($module)) { // insert module into database $settings = [ - 'staticName' => $this->moduleName, - 'providers' => $providers, - 'aliases' => isset($config['aliases']) ? $config['aliases'] : [], - 'order' => isset($config['order']) ? $config['order'] : 0, - 'files' => isset($config['files']) ? $config['files'] : [] + 'providers' => $providers, + 'order' => isset($config['order']) ? $config['order'] : 0, + 'files' => isset($config['files']) ? $config['files'] : [] ]; - $module = Module::install($name, $alias, $description, $handler, $this->parentModuleId, $settings); + $module = Installer::install($name, $alias, $this->moduleName, $description, $handler, $this->parentModuleId, $settings); } // try to install submodules @@ -184,7 +182,7 @@ class InstallModule extends Command $submodule = str_replace($this->modulesPath . DIRECTORY_SEPARATOR, '', $submodulePath); try { - $this->call('install-module', ['name' => $submodule, 'parentModuleId' => $parentModule->id]); + $this->call('module:install', ['name' => $submodule, 'parentModuleId' => $parentModule->id]); } catch (\Exception $e) { $this->error($e->getMessage()); } diff --git a/app/Console/Commands/Modules/ModuleMigrate.php b/app/Console/Commands/Modules/ModuleMigrate.php new file mode 100644 index 00000000..8af774f9 --- /dev/null +++ b/app/Console/Commands/Modules/ModuleMigrate.php @@ -0,0 +1,42 @@ +argument('module'); + $module = Module::where('static_name', $moduleName) + ->firstOrFail(); + + if ($module->has_submodules) { + $submodules = $module->submodules; + + foreach ($submodules as $submodule) { + $this->call('module:migrate', ['module' => $submodule->static_name]); + } + } + + $this->line('Migrating ' . $module->static_name); + $this->call('migrate', ['--path' => config('modules.paths.modules').'/'.$moduleName.'/Database']); + } +} diff --git a/app/Console/Commands/Modules/RunMigrations.php b/app/Console/Commands/Modules/RunMigrations.php new file mode 100644 index 00000000..0e6bd313 --- /dev/null +++ b/app/Console/Commands/Modules/RunMigrations.php @@ -0,0 +1,49 @@ +argument('module'))) { + $modules = $modules->where('static_name', $module); + } + $modules = $modules->get(); + + if ($modules->isEmpty()) { + $this->error('No valid modules.'); + return; + } + + $command = $this->option('rollback') ? 'migrate:rollback' : 'migrate'; + foreach ($modules as $module) { + $this->info('Migrating '.$module->static_name); + + $basePath = $module->is_template ? config('modules.path.templates') : config('modules.paths.modules'); + $path = $basePath . '/' . $module->static_name . '/Database/Migrations/'; + $path = str_replace(base_path(), '', $path); + + $this->call($command, ['--path' => $path]); + } + } +} diff --git a/app/Console/Commands/Modules/UninstallModule.php b/app/Console/Commands/Modules/UninstallModule.php new file mode 100644 index 00000000..6c79c84f --- /dev/null +++ b/app/Console/Commands/Modules/UninstallModule.php @@ -0,0 +1,42 @@ +argument('email'); - - // check if username is really email - if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { - $this->error($email . ' is not a valid e-mail!'); - return; - } + do { + $email = $this->argument('email'); + } while (!filter_var($email, FILTER_VALIDATE_EMAIL)); // ask for password do { @@ -63,6 +58,8 @@ class NewUser extends Command $user->role = $role; $user->save(); + event(new CreateNewUser($user)); + $this->info('User ' . $email . ' successfully created.'); } } diff --git a/app/Console/Commands/SetTemplate.php b/app/Console/Commands/SetTemplate.php index f24c2a7b..a196257c 100644 --- a/app/Console/Commands/SetTemplate.php +++ b/app/Console/Commands/SetTemplate.php @@ -2,6 +2,8 @@ namespace App\Console\Commands; +use App\CMS\ModuleManager\Installer; +use App\CMS\ModuleManager\Uninstaller; use App\Models\Module; use Illuminate\Console\Command; use Illuminate\Support\Facades\Cache; @@ -43,14 +45,13 @@ class SetTemplate extends Command $config['staticName'] = $template; if ($current) { - $info = json_decode($current->module_settings); - - $this->line('Template is already installed. Currently using template ' . trans($current->name) . ' located in /templates/' . $info->staticName . '.'); + $this->line('Template is already installed. Currently using template ' . trans($current->name) . ' located in /templates/' . $current->static_name . '.'); $confirm = $this->confirm('Uninstall it and install *' . trans($config['name']) . '*? All data associated with installed template will be lost!'); if ($confirm) { $this->line('Uninstalling ' . $current->name . '.'); - $current->uninstall(); + + Uninstaller::uninstall($current); } else { $this->line('Aborting installation.'); return; @@ -58,7 +59,7 @@ class SetTemplate extends Command } try { - Module::install($config['name'], $config['alias'], $config['description'], $config['handler'], false, $config); + Installer::install($config['name'], $config['alias'], $config['staticName'], $config['description'], $config['handler'], false, $config); } catch (\Exception $e) { $this->error('Cannot install template ' . $template . '. Message: ' . $e->getMessage()); return; @@ -72,6 +73,8 @@ class SetTemplate extends Command // run again artisan for publishing resources // it cannot be done using $this->call, because we need to load different template into service providers - exec('php artisan vendor:publish'); + if ($publish) { + exec('php artisan vendor:publish'); + } } } diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 00cf4923..a39e7fc0 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -2,6 +2,13 @@ namespace App\Console; +use App\Console\Commands\InstallCMS; +use App\Console\Commands\Modules\CreateMigration; +use App\Console\Commands\Modules\RunMigrations; +use App\Console\Commands\Modules\CreateNew; +use App\Console\Commands\Modules\DisableModule; +use App\Console\Commands\Modules\EnableModule; +use App\Console\Commands\Modules\ModuleMigrate; use App\Console\Commands\PublishTemplateResources; use App\Console\Commands\TemplateInfo; use Illuminate\Console\Scheduling\Schedule; @@ -11,21 +18,27 @@ class Kernel extends ConsoleKernel { /** * The Artisan commands provided by your application. - * * @var array */ protected $commands = [ Commands\NewUser::class, Commands\ChangePassword::class, - Commands\InstallModule::class, - Commands\InstallAllModules::class, + CreateNew::class, + ModuleMigrate::class, + EnableModule::class, + DisableModule::class, + Commands\Modules\InstallModule::class, + Commands\Modules\InstallAllModules::class, Commands\TranslateDirectory::class, Commands\TranslateAll::class, Commands\InitDatabaseSchema::class, Commands\SetTemplate::class, Commands\AddLanguage::class, PublishTemplateResources::class, - TemplateInfo::class + TemplateInfo::class, + InstallCMS::class, + CreateMigration::class, + RunMigrations::class ]; /** @@ -37,7 +50,5 @@ class Kernel extends ConsoleKernel */ protected function schedule(Schedule $schedule) { - // $schedule->command('inspire') - // ->hourly(); } } diff --git a/app/Events/EditWidgetArea.php b/app/Events/EditWidgetArea.php index 8aa5642d..c069772c 100644 --- a/app/Events/EditWidgetArea.php +++ b/app/Events/EditWidgetArea.php @@ -2,10 +2,8 @@ namespace App\Events; -use App\Events\Event; -use App\Models\WidgetArea; +use App\Models\Widgets\WidgetArea; use Illuminate\Queue\SerializesModels; -use Illuminate\Contracts\Broadcasting\ShouldBroadcast; class EditWidgetArea extends Event { diff --git a/app/Events/UploadFile.php b/app/Events/UploadFile.php index 05def8d0..2c67de2f 100644 --- a/app/Events/UploadFile.php +++ b/app/Events/UploadFile.php @@ -2,37 +2,33 @@ namespace App\Events; +use App\Models\FileManager\File as FileModel; use Illuminate\Queue\SerializesModels; -use Symfony\Component\HttpFoundation\File\File; -use Symfony\Component\HttpFoundation\File\UploadedFile; class UploadFile extends Event { use SerializesModels; - /** - * @var UploadedFile - */ public $uploadedFile; /** - * @var + * @var FileModel */ - public $id; + public $file; /** * Create a new event instance. * - * @param File $uploadedFile - * @param $id + * @param FileModel $file + * @param $id + * + * @internal param File $uploadedFile */ - public function __construct(File $uploadedFile, $id) + public function __construct(FileModel $file) { - $this->uploadedFile = $uploadedFile; - $this->id = $id; + $this->file = $file; } /** * Get the channels the event should be broadcast on. - * * @return array */ public function broadcastOn() diff --git a/app/Http/Controllers/Admin/Contents/ContentActions.php b/app/Http/Controllers/Admin/Contents/ContentActions.php index c73c4085..7ee63b40 100644 --- a/app/Http/Controllers/Admin/Contents/ContentActions.php +++ b/app/Http/Controllers/Admin/Contents/ContentActions.php @@ -7,6 +7,8 @@ use App\CMS\Interactions\Admin\Content\ChangeStatus; use App\CMS\Interactions\Admin\Content\DeletePage; use App\CMS\Interactions\Admin\Content\SetHomepage; use App\Http\Controllers\Admin\Controller; +use App\Models\Content\Content; +use App\Models\Content\ContentHistory; class ContentActions extends Controller { @@ -25,15 +27,13 @@ class ContentActions extends Controller * This method is called in static page overview from quick actions. It checks if status is valid, if page exists * and updates status. * - * @param $id - * @param $status + * @param Content $page + * @param $status * * @return \Illuminate\Http\RedirectResponse */ - public function changeStatus($id, $status) + public function changeStatus(Content $page, $status) { - $page = $this->content->getOne($id); - Interaction::handle(ChangeStatus::class, ['status' => $status], $page); // redirect back to overview with info for user @@ -45,14 +45,12 @@ class ContentActions extends Controller /** * Delete page * - * @param $id + * @param Content $page * * @return \Illuminate\Http\RedirectResponse */ - public function delete($id) + public function delete(Content $page) { - $page = $this->content->getOne($id); - Interaction::handle(DeletePage::class, [], $page); // redirect back to overview with info for user @@ -66,14 +64,12 @@ class ContentActions extends Controller /** * Sets page as homepage * - * @param $id + * @param Content $page * * @return \Illuminate\Http\RedirectResponse */ - public function setHomepage($id) + public function setHomepage(Content $page) { - $page = $this->content->getOne($id); - Interaction::handle(SetHomepage::class, [], $page); // redirect back to overview with info for user diff --git a/app/Http/Controllers/Admin/Contents/ContentOverview.php b/app/Http/Controllers/Admin/Contents/ContentOverview.php index b4f09afa..7e5c55d9 100644 --- a/app/Http/Controllers/Admin/Contents/ContentOverview.php +++ b/app/Http/Controllers/Admin/Contents/ContentOverview.php @@ -5,6 +5,7 @@ use App\CMS\Contracts\Repositories\Content as IContent; use App\CMS\Contracts\Repositories\Module as IModule; use App\CMS\Enumerations\ContentStatuses; use App\Http\Controllers\Admin\Controller; +use App\Models\Module; class ContentOverview extends Controller { @@ -26,29 +27,32 @@ class ContentOverview extends Controller /** * Overview for all content pages. * - * @param null|int $moduleId - * @param null $status + * @param Module|null $module + * @param null $status * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + * @internal param int|null $moduleId */ - public function index($moduleId = null, $status = null) + public function index(Module $module, $status = null) { // get module settings - $module = $this->module->getOne($moduleId); $pageHeading = $this->module->getOverviewTitle($module); // get pages for overview - $handler = $module !== null ? $module->handler : null; + $handler = $module->exists ? $module->handler : null; $pages = $this->content->getOverview($handler, [$status]) ->paginate(setting('paginatedResults', 20)); // get homepage - for checking if homepage is set and available $homepage = $this->content->getHomepage(); + $contentModules = app(\App\CMS\Repositories\Module::class)->getContentModules(); + return view('admin.content.overview', [ 'pages' => $pages, 'homepage' => $homepage, 'pageHeading' => $pageHeading, + 'contentModules' => $contentModules, 'statuses' => ContentStatuses::getWithTranslations(), 'module' => isset($module) ? $module : null ]); diff --git a/app/Http/Controllers/Admin/Contents/CreateNewContent.php b/app/Http/Controllers/Admin/Contents/CreateNewContent.php index 18081270..24e047cc 100644 --- a/app/Http/Controllers/Admin/Contents/CreateNewContent.php +++ b/app/Http/Controllers/Admin/Contents/CreateNewContent.php @@ -1,4 +1,5 @@ content = $content; $this->module = $module; - $this->category = $category; $this->template = $template; } @@ -67,13 +61,16 @@ class CreateNewContent extends Controller * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ - public function create($module) + public function create(Module $module) { - $module = $this->module->getOne($module); $statuses = ContentStatuses::getWithTranslations(); $pageHeading = $this->module->getCreateContentTitle($module); $templates = $this->template->getForModule($module); - $categories = $this->category->getForModule($module); + + $categories = new Collection(); + if (class_exists(ICategory::class)) { + $categories = app(ICategory::class)->getForModule($module); + } $page = $this->content->getOne(); @@ -95,15 +92,14 @@ class CreateNewContent extends Controller /** * Save new content page * - * @param CreateNewContentRequest $request - * @param $moduleId + * @param CreateNewContentRequest|Request $request + * @param Module $module * * @return \Illuminate\Http\RedirectResponse + * @internal param $moduleId */ - public function store(Request $request, $moduleId) + public function store(Request $request, Module $module) { - $module = $this->module->getOne($moduleId); - // create new page Interaction::handle(NewContent::class, $request->all(), $module->handler); diff --git a/app/Http/Controllers/Admin/Contents/EditContent.php b/app/Http/Controllers/Admin/Contents/EditContent.php index 4d0104cb..9fe2da1d 100644 --- a/app/Http/Controllers/Admin/Contents/EditContent.php +++ b/app/Http/Controllers/Admin/Contents/EditContent.php @@ -1,4 +1,5 @@ history = $history; $this->file = $file; $this->content = $content; $this->module = $module; - $this->category = $category; $this->template = $template; } /** * Display form for editing static page * - * @param $id + * @param Content $page * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ - public function edit($id) + public function edit(Content $page) { $statuses = ContentStatuses::getWithTranslations(); - $page = $this->content->getOne($id); // get module ID $module = $this->module->getByHandler($page->moduleHandler); $pageHeading = $this->module->getUpdateContentTitle($module, $page); $templates = $this->template->getForModule($module); - $categories = $this->category->getForModule($module); $history = $this->history->getStructuredHistoryOf($page); + $categories = new Collection(); + if (class_exists(ICategory::class)) { + $categories = app(ICategory::class)->getForModule($module); + } + // render view return view('admin.content.edit', [ 'pageHeading' => $pageHeading, @@ -94,7 +89,8 @@ class EditContent extends Controller 'page' => $page, 'module' => $module, 'categories' => $categories, - 'rootPages' => $this->content->getOverview()->get(), + 'rootPages' => $this->content->getOverview() + ->get(), 'templates' => $templates, 'formSectionNames' => $this->module->call($module, 'getExtendedFormSections'), 'formSections' => $this->module->call($module, 'getExtendedFormInputsEdit'), @@ -105,29 +101,14 @@ class EditContent extends Controller /** * Edit static page and save changes into history. * - * @param EditContentRequest $request - * @param $id + * @param EditContentRequest|Request $request + * @param Content $page * * @return \Illuminate\Http\RedirectResponse + * @internal param $id */ - public function update(Request $request, $id) + public function update(Request $request, Content $page) { - try { - /** - * @var $page Content - */ - $page = $this->content->getOne($id); - } catch (NotFoundHttpException $e) { - - // log attempt of invalid edit - Event::fire(new AttemptToEditInvalidContent($id)); - - // page for editing not found - return redirect() - ->route('content.overview') - ->with('error', trans('admin/contents.invalidPage')); - } - // edit page Interaction::handle(EditContentInteraction::class, $request->all(), $page); @@ -136,4 +117,24 @@ class EditContent extends Controller ->route('content.overview') ->with('success', trans('admin/contents.successfullyEdited')); } + + public function order() { + $pages = $this->content->getOverview()->get(); + + return view('admin.content.order', compact('pages')); + } + + public function setOrder(Request $request) { + + $data = $request->get('page'); + + foreach ($data as $id => $order) { + Content::where('id', $id)->update(['order' => $order]); + } + + // something was changed, inform user + return redirect() + ->route('content.overview') + ->with('success', trans('admin/contents.orderSuccessfullySet')); + } } \ No newline at end of file diff --git a/app/Http/Controllers/Admin/Contents/History.php b/app/Http/Controllers/Admin/Contents/History.php index 28b74412..7811b507 100644 --- a/app/Http/Controllers/Admin/Contents/History.php +++ b/app/Http/Controllers/Admin/Contents/History.php @@ -19,30 +19,31 @@ class History extends Controller } /** - * @param $id + * @param Content $page * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ - public function getOverview($id) + public function getOverview(Content $page) { - // test if given content id is static page and if exists - $content = Content::findOrFail($id); - - $history = $this->history->getStructuredHistoryOf($content); + $history = $this->history->getStructuredHistoryOf($page); return view('admin/history.overview', [ 'history' => $history, - 'page' => $content + 'page' => $page ]); } - public function getDiff($revision, $id) + /** + * @param ContentHistory $revision + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function getDiff(ContentHistory $revision) { - $change = $this->history->findOrFail($id); - $diff = $this->history->getDiff($change); + $diff = $this->history->getDiff($revision); return view('admin/history.diff', [ - 'change' => $change, + 'change' => $revision, 'diff' => $diff ]); } diff --git a/app/Http/Controllers/Admin/Dashboard/Dashboard.php b/app/Http/Controllers/Admin/Dashboard/Dashboard.php index bad941c3..cfacc789 100644 --- a/app/Http/Controllers/Admin/Dashboard/Dashboard.php +++ b/app/Http/Controllers/Admin/Dashboard/Dashboard.php @@ -2,13 +2,22 @@ namespace App\Http\Controllers\Admin\Dashboard; +use App\CMS\Contracts\Repositories\Module; use App\Http\Controllers\Admin\Controller; -use Illuminate\Http\Request; +use App\Models\Content\Content; +use Illuminate\Support\Facades\Auth; class Dashboard extends Controller { - public function index(Request $request) + public function index() { - return redirect()->route('content.overview'); + $contentModules = app(Module::class)->getContentModules(); + + if (\Auth::user() + ->can('manage', Content::class) && !$contentModules->isEmpty()) { + return redirect()->route('content.overview'); + } else { + return redirect()->route('users.detail', ['user' => Auth::user()]); + } } } diff --git a/app/Http/Controllers/Admin/FileManager/CreateNewDirectory.php b/app/Http/Controllers/Admin/FileManager/CreateNewDirectory.php index f6b4732c..8a9a3396 100644 --- a/app/Http/Controllers/Admin/FileManager/CreateNewDirectory.php +++ b/app/Http/Controllers/Admin/FileManager/CreateNewDirectory.php @@ -8,6 +8,7 @@ use App\CMS\Interactions\Admin\FileManager\CreateDirectory; use App\CMS\Repositories\FileManager\Directory as DirectoryRepository; use App\Http\Controllers\Admin\Controller; use App\Http\Requests; +use App\Models\FileManager\Directory; use Illuminate\Http\Request; class CreateNewDirectory extends Controller @@ -30,9 +31,10 @@ class CreateNewDirectory extends Controller /** * Create new directory * - * @param Requests\CreateNewDirectoryRequest $request + * @param Requests\CreateNewDirectoryRequest|Request $request * * @return $this|\Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse + * @internal param Directory $parentDirectory */ public function store(Request $request) { diff --git a/app/Http/Controllers/Admin/FileManager/EditDirectory.php b/app/Http/Controllers/Admin/FileManager/EditDirectory.php index f9e5b12e..9da13545 100644 --- a/app/Http/Controllers/Admin/FileManager/EditDirectory.php +++ b/app/Http/Controllers/Admin/FileManager/EditDirectory.php @@ -5,19 +5,20 @@ namespace App\Http\Controllers\Admin\FileManager; use App\CMS\Repositories\FileManager\Directory as DirectoryRepository; use App\Http\Controllers\Admin\Controller; use App\Http\Requests; +use App\Http\Requests\EditDirectoryRequest; use App\Models\FileManager\Directory; class EditDirectory extends Controller { /** - * @param Requests\EditDirectoryRequest $request + * @param EditDirectoryRequest $request * @param Directory $directory * * @return $this|\Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse * @internal param $directoryId * */ - public function update(Requests\EditDirectoryRequest $request, Directory $directory) + public function update(EditDirectoryRequest $request, Directory $directory) { $repository = app(DirectoryRepository::class); if ($repository->checkIfNameExists($request->name, $directory->parent_id, $directory->id)) { diff --git a/app/Http/Controllers/Admin/FileManager/EditUploadedFile.php b/app/Http/Controllers/Admin/FileManager/EditUploadedFile.php index 374f4dcf..de494d21 100644 --- a/app/Http/Controllers/Admin/FileManager/EditUploadedFile.php +++ b/app/Http/Controllers/Admin/FileManager/EditUploadedFile.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers\Admin\FileManager; use App\CMS\Helpers\FileManager; use App\CMS\Helpers\RootDirectory; +use App\CMS\Repositories\FileManager\File as FileRepository; use App\Events\EditFile; use App\Http\Controllers\Admin\Controller; use App\Http\Requests\EditUploadedFileRequest; @@ -14,14 +15,12 @@ class EditUploadedFile extends Controller { /** * Edit form - * * Render edit form for displaying details and updating given file * * @param File $file * * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\View\View * @internal param int $id file id - * */ public function show(File $file) { @@ -35,7 +34,6 @@ class EditUploadedFile extends Controller /** * Updates file - * * User can change only keywords, original filename and description. Mime type, hash and other fields remain * unchanged * @@ -44,16 +42,11 @@ class EditUploadedFile extends Controller * * @return \Illuminate\Http\RedirectResponse * @internal param $id - * */ public function update(EditUploadedFileRequest $request, File $file) { - // set values from form - $file->name = $request->name; - $file->keywords = $request->keywords; - $file->description = $request->description; - $file->directory_id = $request->directory_id; - $file->save(); + $repository = app(FileRepository::class); + $repository->update($file, $request->all()); // fire action Event::fire(new EditFile($file)); diff --git a/app/Http/Controllers/Admin/FileManager/UploadFile.php b/app/Http/Controllers/Admin/FileManager/UploadFile.php index 3c4a7933..03b5f91f 100644 --- a/app/Http/Controllers/Admin/FileManager/UploadFile.php +++ b/app/Http/Controllers/Admin/FileManager/UploadFile.php @@ -1,8 +1,8 @@ directoryRepository->getAllSubdirectories($directory); - if (!$includeHidden) { + if (!Input::get('hidden', true)) { $subdirectories = $subdirectories->where('hidden', false); } diff --git a/app/Http/Controllers/Admin/Login.php b/app/Http/Controllers/Admin/Login.php deleted file mode 100644 index 524cd8f9..00000000 --- a/app/Http/Controllers/Admin/Login.php +++ /dev/null @@ -1,87 +0,0 @@ -email; - - // try to find user - $user = User::where('email', $email) - ->where('role', '!=', User::ROLE_VISITOR) - ->where('status', User::STATE_ACTIVE) - ->first(); - - if (!$user) { - return $this->loginFailed(); - } - - // try to log in user - if (Hash::check($request->password, $user->password)) { - Auth::login($user); - - $redirect = $request->redirectTo ? $request->redirectTo : route('admin.dashboard'); - - return redirect()->intended($redirect); - } - - // login invalid, redirect and inform the user - return $this->loginFailed(); - } - - /** - * Logs out user - * - * @return \Illuminate\Http\RedirectResponse - */ - public function logout() - { - - // remove user information - \Auth::logout(); - - // redirect to login form with info about successfull logout - return redirect() - ->route('login') - ->with('success', trans('admin/common.logoutSuccessfull')); - } - - private function loginFailed() - { - return redirect() - ->route('login') - ->with('error', trans('auth.failed')) - ->withInput(); - } -} diff --git a/app/Http/Controllers/Admin/Permissions.php b/app/Http/Controllers/Admin/Permissions.php new file mode 100644 index 00000000..0f9636a7 --- /dev/null +++ b/app/Http/Controllers/Admin/Permissions.php @@ -0,0 +1,43 @@ +get(); + + return view('admin/permissions.index', compact('permissions')); + } + + /** + * Setup default permissions + * + * @param Request $request + * + * @return \Illuminate\Http\RedirectResponse + */ + public function setDefault(Request $request) + { + Permission::where('default', true) + ->update(['default' => false]); + + $permissions = $request->permissions; + + Permission::whereIn('string_id', array_keys($permissions)) + ->update(['default' => true]); + + return redirect() + ->back() + ->with('success', trans('admin/permissions.defaultSuccessfullySet')); + } +} diff --git a/app/Http/Controllers/Admin/Search.php b/app/Http/Controllers/Admin/Search.php index 1d93c14f..ffabde36 100644 --- a/app/Http/Controllers/Admin/Search.php +++ b/app/Http/Controllers/Admin/Search.php @@ -13,7 +13,6 @@ class Search extends Controller { /** * Create form for searching - * * @return $this|\Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function getSearch() @@ -37,7 +36,6 @@ class Search extends Controller /** * Method used for performing search. - * * This method iterates over all registered search engines and returns results for each engine apart. * * @param string $term search text @@ -60,10 +58,16 @@ class Search extends Controller // try to find given term $results = $search->search($term); + $content = $presenter->render($results); + + if (is_null($content)) { + continue; + } + // create result object $resultsParts[$search->getId()] = [ 'name' => $search->getName(), - 'content' => $presenter->render($results), + 'content' => $content, 'count' => count($results) ]; } diff --git a/app/Http/Controllers/Admin/Settings.php b/app/Http/Controllers/Admin/Settings.php index db782248..31e4a285 100644 --- a/app/Http/Controllers/Admin/Settings.php +++ b/app/Http/Controllers/Admin/Settings.php @@ -2,15 +2,15 @@ namespace App\Http\Controllers\Admin; +use App\CMS\Repositories\Settings\Settings as SettingsRepository; use App\Http\Requests; use App\Models\Settings as SettingsModel; use Illuminate\Support\Facades\App; -use Mcamara\LaravelLocalization\Facades\LaravelLocalization; class Settings extends Controller { /** - * @var SettingsModel + * @var SettingsRepository */ protected $settings; @@ -19,14 +19,13 @@ class Settings extends Controller * * @param SettingsModel $settings */ - public function __construct(SettingsModel $settings) + public function __construct(SettingsRepository $settings) { $this->settings = $settings; } /** * Get overview (with form) for editing settings - * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function getOverview() @@ -45,7 +44,6 @@ class Settings extends Controller /** * Save all settings (ignore empty ones) - * * When settings used to be non-empty string and user deletes it, key is also deleted from database * * @param Requests\SaveSettingsRequest $request @@ -54,25 +52,8 @@ class Settings extends Controller */ public function saveSettings(Requests\SaveSettingsRequest $request) { - $data = $request->all(); - $commonSettings = isset($data['commonSettings']) ? $data['commonSettings'] : []; - // remove CSRF token field - unset($data['_token'], $data['commonSettings']); - - foreach ($data as $key => $value) { - // select language for this setting key - $language = isset($commonSettings[$key]) ? null : LaravelLocalization::getCurrentLocale(); - $setting = SettingsModel::firstOrNew(['language' => $language, 'key' => $key]); - - if ($setting->value == $value) { - continue; - } - - // set value and save or delete - $setting->value = $value; - $setting->save(); - } + $this->settings->save($request->except(['_token'])); return redirect() ->route('settings.overview') diff --git a/app/Http/Controllers/Admin/Templates/CopyTemplate.php b/app/Http/Controllers/Admin/Templates/CopyTemplate.php index 41701e16..b0ea9bfe 100644 --- a/app/Http/Controllers/Admin/Templates/CopyTemplate.php +++ b/app/Http/Controllers/Admin/Templates/CopyTemplate.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Admin\Templates; +use App\Cms\Repositories\Templates\Template as TemplateRepository; use App\Http\Controllers\Admin\Controller; use App\Http\Requests\CopyTemplateRequest; use App\Models\Templates\Template; @@ -10,7 +11,6 @@ class CopyTemplate extends Controller { /** * Method for copying given template. - * * This method is supposed to be called by POST method. * * @param CopyTemplateRequest $request @@ -32,15 +32,22 @@ class CopyTemplate extends Controller $namespace .= '::'; } + $repository = app(TemplateRepository::class); + $repository->setModel($template); + // get template absolute paths - $realTemplatePath = $template->getPathToTemplate(); - $customTemplatePath = $template->getPathToTemplate(Template::CUSTOM_EDIT_DIRECTORY); + $realTemplatePath = $repository->getPathToTemplate(); + $customTemplatePath = $repository->getPathToTemplate(TemplateRepository::CUSTOM_EDIT_DIRECTORY); $path = dirname($customTemplatePath); // create file copy $data = file_get_contents($realTemplatePath); - $written = file_put_contents($path . DIRECTORY_SEPARATOR . $newName . Template::TEMPLATE_SUFFIX, $data); + if (!is_dir($path)) { + mkdir($path, 0777, true); + } + + $written = file_put_contents($path . DIRECTORY_SEPARATOR . $newName . TemplateRepository::TEMPLATE_SUFFIX, $data); // were data written? if ($written === false) { return $this->copyFailed($request, $template); @@ -67,7 +74,6 @@ class CopyTemplate extends Controller * @param Template $template * * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse - * */ private function copyFailed(CopyTemplateRequest $request, Template $template) { diff --git a/app/Http/Controllers/Admin/Templates/EditTemplate.php b/app/Http/Controllers/Admin/Templates/EditTemplate.php index 2938c129..65998dc2 100644 --- a/app/Http/Controllers/Admin/Templates/EditTemplate.php +++ b/app/Http/Controllers/Admin/Templates/EditTemplate.php @@ -34,13 +34,8 @@ class EditTemplate extends Controller * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ - public function getEdit($template) + public function getEdit(Template $template) { - /** - * @var $template Template - */ - $template = Template::findOrFail($template); - $this->templateRepository->setModel($template); // load template content @@ -59,15 +54,13 @@ class EditTemplate extends Controller * Save meta information about template and edited content * * @param EditTemplateRequest $request - * @param $templateId + * @param Template $template * * @return \Illuminate\Http\RedirectResponse + * @internal param $templateId */ - public function postEdit(EditTemplateRequest $request, $templateId) + public function postEdit(EditTemplateRequest $request, Template $template) { - // find template - $template = Template::findOrFail($templateId); - // setup meta information $template->name = $request->name; @@ -105,7 +98,7 @@ class EditTemplate extends Controller // try to save content if (!is_writable($customDir) && !is_writable($originalDir)) { return redirect() - ->route('templates.edit', ['id' => $request->id]) + ->route('templates.edit', ['id' => $template->id]) ->withInput() ->with('warning', trans('admin/templates.cannotWriteContent')); } diff --git a/app/Http/Controllers/Admin/Templates/TemplateOverview.php b/app/Http/Controllers/Admin/Templates/TemplateOverview.php index 6576b76a..98609767 100644 --- a/app/Http/Controllers/Admin/Templates/TemplateOverview.php +++ b/app/Http/Controllers/Admin/Templates/TemplateOverview.php @@ -7,17 +7,28 @@ use App\Models\Templates\TemplatePath; class TemplateOverview extends Controller { - public function getPath($path) + public function index() { - $path = TemplatePath::findOrFail($path); + $templatePaths = TemplatePath::with('subdirectories') + ->whereNull('parent_id') + ->get(); + + return view('admin.templates.index', compact('templatePaths')); + } + + /** + * Display overview of all templates in given path + * + * @param TemplatePath $templatePath + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function getPath(TemplatePath $templatePath) + { return view('admin.templates.list', [ - 'directory' => $path, - 'isWritable' => is_writable(base_path($path->path)), - 'templates' => $path->templates() - ->get(), - 'subdirectories' => $path->subdirectories() - ->get() + 'directory' => $templatePath, + 'isWritable' => is_writable(base_path($templatePath->path)) ]); } } diff --git a/app/Http/Controllers/Admin/Users/CreateNewUser.php b/app/Http/Controllers/Admin/Users/CreateNewUser.php index 863e5fe0..dac56a3b 100644 --- a/app/Http/Controllers/Admin/Users/CreateNewUser.php +++ b/app/Http/Controllers/Admin/Users/CreateNewUser.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Admin\Users; use App\CMS\Enumerations\UserRoles; +use App\CMS\Repositories\Users\User as UserRepository; use App\Events\CreateNewUser as CreateNewUserEvent; use App\Http\Controllers\Admin\Controller; use App\Http\Requests\CreateNewUserRequest; @@ -28,28 +29,21 @@ class CreateNewUser extends Controller /** * Create new user - * * This method saves new user into database * * @param CreateNewUserRequest $request + * @param UserRepository $userRepository * * @return \Illuminate\Http\RedirectResponse */ - protected function postRegistration(CreateNewUserRequest $request) + protected function postRegistration(CreateNewUserRequest $request, UserRepository $userRepository) { // when user did not provide any username, use his email $username = isset($request->username) && !empty($request->username) ? $request->username : $request->email; - // create new user - $user = new User(); - $user->name = $request->name; - $user->email = $request->email; - $user->username = $username; - $user->role = $request->role; - $user->password = Hash::make($request->password); - - // store user into database - $user->save(); + $data = $request->all(); + $data['username'] = $username; + $user = $userRepository->create($data); // fire event Event::fire(new CreateNewUserEvent($user)); diff --git a/app/Http/Controllers/Admin/Users/EditUser.php b/app/Http/Controllers/Admin/Users/EditUser.php index 1b77f3a8..b111d1f8 100644 --- a/app/Http/Controllers/Admin/Users/EditUser.php +++ b/app/Http/Controllers/Admin/Users/EditUser.php @@ -4,26 +4,48 @@ namespace App\Http\Controllers\Admin\Users; use App\CMS\Enumerations\UserRoles; use App\CMS\Enumerations\UserStates; +use App\CMS\Repositories\Users\User as UserRepository; use App\Events\EditUser as EditUserEvent; use App\Http\Controllers\Admin\Controller; use App\Http\Requests\EditUserRequest; +use App\Http\Requests\Request; +use App\Models\Permissions\Permission; use App\Models\User; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Event; -use Illuminate\Support\Facades\Hash; class EditUser extends Controller { - public function getEditUser($id = null) + /** + * @var UserRepository + */ + private $userRepository; + + /** + * EditUser constructor. + * + * @param UserRepository $userRepository + */ + public function __construct(UserRepository $userRepository) + { + $this->userRepository = $userRepository; + } + + /** + * Display form for editing user + * + * @param User|null $user + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function getEditUser(User $user = null) { // when no user specified, lets assume we want to edit "me" - if (!$id) { - $id = Auth::user()->id; + if (!$user->exists) { + $user = Auth::user(); } - // try to find given user - $user = User::findOrFail($id); - $states = UserStates::getWithTranslations(); $roles = UserRoles::getWithTranslations(); @@ -35,49 +57,26 @@ class EditUser extends Controller } /** + * Edit user - store information + * * @param EditUserRequest $request - * @param $id + * @param User $user * * @return \Illuminate\Http\RedirectResponse + * @internal param $id */ - public function postEdit(EditUserRequest $request, $id) + public function postEdit(EditUserRequest $request, User $user) { $loggedUser = Auth::user(); - $user = User::findOrFail($id); - // non-admin user is trying to edit someone else - if ($loggedUser->role != User::ROLE_ADMIN && $id != $loggedUser->id) { + if ($loggedUser->role != User::ROLE_ADMIN && $user->id != $loggedUser->id) { return redirect() ->back() ->with('error', trans('auth.accessDenied')); } - // update username if set - if (isset($request->username)) { - $user->username = $request->username; - } - - // change name (if set) - if (isset($request->name)) { - $user->name = $request->name; - } - - if (isset($request->role)) { - $user->role = $request->role; - } - - if (isset($request->status)) { - $user->status = $request->status; - } - - if (isset($request->password)) { - $user->password = Hash::make($request->password); - } - - $user->email = $request->email; - - $user->save(); + $this->userRepository->update($user, $request->all()); // fire event about editing user Event::fire(new EditUserEvent($user)); @@ -86,4 +85,34 @@ class EditUser extends Controller ->back() ->with('success', trans('admin/userManagement.userSuccessfullyEdited')); } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * + * @return \Illuminate\Http\Response + */ + public function setPermissions(Request $request, User $user) + { + $permissionIds = $request->get('permissions', []); + $permissions = Permission::whereIn('string_id', array_keys($permissionIds)) + ->get(); + + DB::transaction(function () use ($user, $permissions) { + // remove all permissions + $user->permissions() + ->detach(); + + foreach ($permissions as $permission) { + $user->permissions() + ->attach($permission->id); + } + }); + + return redirect() + ->back() + ->with('success', trans('admin/permissions.successfullySet')); + } } \ No newline at end of file diff --git a/app/Http/Controllers/Admin/Users/UserDetail.php b/app/Http/Controllers/Admin/Users/UserDetail.php index ae6c1d3e..47b71498 100644 --- a/app/Http/Controllers/Admin/Users/UserDetail.php +++ b/app/Http/Controllers/Admin/Users/UserDetail.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Admin\Users; use App\CMS\Enumerations\UserRoles; use App\CMS\Enumerations\UserStates; use App\Cms\Repositories\ActionLog\Actions; +use App\CMS\Repositories\Permissions\Permission; use App\Http\Controllers\Admin\Controller; use App\Models\ActionLog\ActionLog; use App\Models\User; @@ -22,26 +23,24 @@ class UserDetail extends Controller $this->log = $log; } - public function getDetail($id = null) + public function getDetail(User $user = null) { // when no user specified, lets assume we want to edit "me" - if (!$id) { - $id = Auth::user()->id; + if (!$user->exists) { + $user = Auth::user(); } - // try to find given user - $user = User::findOrFail($id); - - $actions = $this->log->getUserActions($id, 10); - + $actions = $this->log->getUserActions($user->id, 10); $roles = UserRoles::getWithTranslations(); $states = UserStates::getWithTranslations(); + $permissions = app(Permission::class)->getRootPermissions(); return view('admin.userManagement.detail', [ - 'user' => $user, - 'statuses' => $states, - 'roles' => $roles, - 'actions' => $actions + 'user' => $user, + 'statuses' => $states, + 'roles' => $roles, + 'actions' => $actions, + 'permissions' => $permissions ]); } } \ No newline at end of file diff --git a/app/Http/Controllers/Admin/Widgets/Areas/CreateNewWidgetArea.php b/app/Http/Controllers/Admin/Widgets/Areas/CreateNewWidgetArea.php index a9ec44e3..636b469e 100644 --- a/app/Http/Controllers/Admin/Widgets/Areas/CreateNewWidgetArea.php +++ b/app/Http/Controllers/Admin/Widgets/Areas/CreateNewWidgetArea.php @@ -2,19 +2,34 @@ namespace App\Http\Controllers\Admin\Widgets\Areas; +use App\CMS\Repositories\Widgets\WidgetArea as WidgetAreaRepository; use App\Http\Controllers\Admin\Controller; use App\Http\Requests\NewWidgetAreaRequest; use App\Models\Widgets\WidgetArea; -use Illuminate\Support\Facades\Event; class CreateNewWidgetArea extends Controller { + /** + * @var WidgetAreaRepository + */ + private $widgetAreaRepository; + + /** + * CreateNewWidgetArea constructor. + * + * @param WidgetAreaRepository $widgetAreaRepository + */ + public function __construct(WidgetAreaRepository $widgetAreaRepository) + { + $this->widgetAreaRepository = $widgetAreaRepository; + } + /** * Form for new widget area * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ - public function getNew() + public function create() { return view('admin.widgets.area.new', ['area' => new WidgetArea()]); } @@ -24,18 +39,9 @@ class CreateNewWidgetArea extends Controller * * @return \Illuminate\Http\RedirectResponse */ - public function postNew(NewWidgetAreaRequest $request) + public function store(NewWidgetAreaRequest $request) { - $parameters = [ - 'code' => $request->code, - 'name' => $request->name, - 'description' => $request->description - ]; - - $area = WidgetArea::create($parameters); - - // fire event with new widget area - Event::fire(new \App\Events\CreateNewWidgetArea($area)); + $this->widgetAreaRepository->create($request); // redirect with success notification return redirect() diff --git a/app/Http/Controllers/Admin/Widgets/Areas/EditWidgetArea.php b/app/Http/Controllers/Admin/Widgets/Areas/EditWidgetArea.php index a512334c..393745b8 100644 --- a/app/Http/Controllers/Admin/Widgets/Areas/EditWidgetArea.php +++ b/app/Http/Controllers/Admin/Widgets/Areas/EditWidgetArea.php @@ -2,6 +2,8 @@ namespace App\Http\Controllers\Admin\Widgets\Areas; +use App\CMS\Repositories\Widgets\WidgetArea as WidgetAreaRepository; +use App\Events\DeleteWidgetArea; use App\Http\Controllers\Admin\Controller; use App\Http\Requests\EditWidgetAreaRequest; use App\Models\Widgets\Widget; @@ -13,22 +15,37 @@ use Mcamara\LaravelLocalization\Facades\LaravelLocalization; class EditWidgetArea extends Controller { + /** + * @var WidgetAreaRepository + */ + private $widgetAreaRepository; + + /** + * EditWidgetArea constructor. + * + * @param WidgetAreaRepository $widgetAreaRepository + */ + public function __construct(WidgetAreaRepository $widgetAreaRepository) + { + $this->widgetAreaRepository = $widgetAreaRepository; + } + /** * Display form for editing given widget area * - * @param $id + * @param WidgetArea $widgetArea * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + * */ - public function getEdit($id) + public function edit(WidgetArea $widgetArea) { - $area = WidgetArea::findOrFail($id); - $associatedWidgetIds = WidgetInWidgetArea::getWidgetIdsFromArea($area->id); + $associatedWidgetIds = WidgetInWidgetArea::getWidgetIdsFromArea($widgetArea->id); $widgets = Widget::where('language', LaravelLocalization::getCurrentLocale()) ->paginate(25); return view('admin.widgets.area.edit', [ - 'area' => $area, + 'area' => $widgetArea, 'widgets' => $widgets, 'associatedWidgetIds' => $associatedWidgetIds ]); @@ -36,26 +53,14 @@ class EditWidgetArea extends Controller /** * @param EditWidgetAreaRequest $request - * @param $id + * @param WidgetArea $widgetArea * * @return \Illuminate\Http\RedirectResponse + * */ - public function postEdit(EditWidgetAreaRequest $request, $id) + public function update(EditWidgetAreaRequest $request, WidgetArea $widgetArea) { - try { - $area = WidgetArea::findOrFail($id); - } catch (ModelNotFoundException $e) { - return $this->invalidArea(); - } - - $area->name = $request->name; - $area->description = $request->description; - - $area->timestamps = true; - $area->save(); - - // fire event with new widget area - Event::fire(new \App\Events\EditWidgetArea($area)); + $this->widgetAreaRepository->update($widgetArea, $request); return redirect() ->route('widgetareas.overview') @@ -65,47 +70,28 @@ class EditWidgetArea extends Controller /** * Hard deletes widget area * - * @param $id + * @param WidgetArea $widgetArea * * @return \Illuminate\Http\RedirectResponse */ - public function deleteArea($id) + public function delete(WidgetArea $widgetArea) { - // try to find area - try { - $area = WidgetArea::findOrFail($id); - } catch (ModelNotFoundException $e) { - return $this->invalidArea(); - } - // check if widget area is deletable - if (!$area->deletable) { + if (!$widgetArea->deletable) { return redirect() ->back() ->with('error', trans('admin/widgetAreas.notDeletableArea')); } // delete area - $area->delete(); + $widgetArea->delete(); // fire event with new widget area - Event::fire(new \App\Events\DeleteWidgetArea($area)); + Event::fire(new DeleteWidgetArea($widgetArea)); // redirect and inform user return redirect() ->route('widgetareas.overview') ->with('success', trans('admin/widgetAreas.successfullyDeleted')); } - - /** - * Redirect user to overview with message about invalid widget area - * - * @return \Illuminate\Http\RedirectResponse - */ - private function invalidArea() - { - return redirect() - ->route('widgetareas.overview') - ->with('error', trans('admin/widgetAreas.invalidArea')); - } } diff --git a/app/Http/Controllers/Admin/Widgets/CreateNewWidget.php b/app/Http/Controllers/Admin/Widgets/CreateNewWidget.php index f50f749b..1195deac 100644 --- a/app/Http/Controllers/Admin/Widgets/CreateNewWidget.php +++ b/app/Http/Controllers/Admin/Widgets/CreateNewWidget.php @@ -23,14 +23,13 @@ class CreateNewWidget extends Controller /** * Form for new widget area * - * @param $type + * @param WidgetType $widgetType * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + * */ - public function getNew($type) + public function getNew(WidgetType $widgetType) { - $widgetType = WidgetType::findOrFail($type); - $presenter = call_user_func([$widgetType->handler, 'getPresenter']); return call_user_func([$presenter, 'renderAddForm'], $widgetType); @@ -40,23 +39,22 @@ class CreateNewWidget extends Controller * Create new instance of given widget type * * @param NewWidgetRequest $request - * @param $type + * + * @param WidgetType $widgetType * * @return \Illuminate\Http\RedirectResponse */ - public function postNew(NewWidgetRequest $request, $type) + public function postNew(NewWidgetRequest $request, WidgetType $widgetType) { - $widgetType = WidgetType::findOrFail($type); - // try to save this widget try { $this->widget->createNew($widgetType, $request); } catch (MissingParameterException $e) { // user omitted some value - return $this->invalidWidget($type, $e->getMessage()); - // } catch (\Exception $e) { - // // something went wrong - // return $this->invalidWidget($type, trans('admin/widgets.cannotSave', ['exception' => $e->getMessage()])); + return redirect() + ->back() + ->withInput() + ->with('error', $e->getMessage()); } // redirect with success notification @@ -64,12 +62,4 @@ class CreateNewWidget extends Controller ->route('widgets.overview') ->with('success', trans('admin/widgets.successfullyCreated')); } - - private function invalidWidget($widgetType, $error) - { - return redirect() - ->route('widgets.new', ['type' => $widgetType]) - ->withInput() - ->with('error', $error); - } } diff --git a/app/Http/Controllers/Admin/Widgets/EditWidget.php b/app/Http/Controllers/Admin/Widgets/EditWidget.php index 81ca9ad2..0548b895 100644 --- a/app/Http/Controllers/Admin/Widgets/EditWidget.php +++ b/app/Http/Controllers/Admin/Widgets/EditWidget.php @@ -1,26 +1,39 @@ widgetRepository = $widgetRepository; + } + /** * Render edit form * - * @param $id + * @param Widget $widget * * @return mixed */ - public function getEdit($id) + public function getEdit(Widget $widget) { - $widget = Widget::findOrFail($id); - $widget->settings = json_decode($widget->settings); - $presenter = call_user_func([$widget->widget_type_handler, 'getPresenter']); return call_user_func([$presenter, 'renderEditForm'], $widget); @@ -30,24 +43,14 @@ class EditWidget extends Controller * Save changes into database * * @param EditWidgetRequest $request - * @param $widget + * @param Widget $widget * * @return \Illuminate\Http\RedirectResponse */ - public function postEdit(EditWidgetRequest $request, $widget) + public function postEdit(EditWidgetRequest $request, Widget $widget) { - // create new widget - $widget = Widget::findOrFail($widget); - - // update name - $widget->name = $request->name; - $widget->container_class = $request->containerClass; - $widget->container_id = empty($request->containerId) ? null : $request->containerId; - $widget->description = $request->description; - - // try to save this widget try { - $widget->settings = json_encode(call_user_func([$widget->widget_type_handler, 'save'], $request)); + $this->widgetRepository->edit($widget, $request); } catch (MissingParameterException $e) { // user omitted some value return $this->invalidWidget($e->getMessage()); @@ -56,12 +59,6 @@ class EditWidget extends Controller return $this->invalidWidget(trans('admin/widgets.cannotSave', ['exception' => $e->getMessage()])); } - // save into database - $widget->save(); - - // fire event with editing widget - Event::fire(new \App\Events\EditWidget($widget)); - // redirect with success notification return redirect() ->back() @@ -71,15 +68,12 @@ class EditWidget extends Controller /** * Deletes widget * - * @param $id + * @param Widget $widget * * @return \Illuminate\Http\RedirectResponse */ - public function deleteWidget($id) + public function deleteWidget(Widget $widget) { - // create new widget - $widget = Widget::findOrFail($id); - // check if widget area is deletable if (!$widget->deletable) { return redirect() diff --git a/app/Http/Controllers/Admin/Widgets/WidgetsOverview.php b/app/Http/Controllers/Admin/Widgets/WidgetsOverview.php index 4f95be2c..e5cd5529 100644 --- a/app/Http/Controllers/Admin/Widgets/WidgetsOverview.php +++ b/app/Http/Controllers/Admin/Widgets/WidgetsOverview.php @@ -1,17 +1,25 @@ paginate(25); - return view('admin.widgets.overview', ['widgets' => $widgets]); + $widgetTypes = WidgetType::all(); + + return view('admin.widgets.overview', compact('widgetTypes', 'widgets')); } } \ No newline at end of file diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php new file mode 100644 index 00000000..6a247fef --- /dev/null +++ b/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -0,0 +1,32 @@ +middleware('guest'); + } +} diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php new file mode 100644 index 00000000..a4c37755 --- /dev/null +++ b/app/Http/Controllers/Auth/LoginController.php @@ -0,0 +1,46 @@ +middleware('guest')->except('logout'); + } + + public function logout() { + Auth::logout(); + return redirect()->route('login'); + } +} diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php new file mode 100644 index 00000000..de74489d --- /dev/null +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -0,0 +1,73 @@ +middleware('guest'); + } + + /** + * Get a validator for an incoming registration request. + * + * @param array $data + * + * @return \Illuminate\Contracts\Validation\Validator + */ + protected function validator(array $data) + { + return Validator::make($data, [ + 'name' => 'required|string|max:255', + 'email' => 'required|string|email|max:255|unique:users', + 'password' => 'required|string|min:6|confirmed', + 'g-recaptcha-response' => 'required|recaptcha', + ]); + } + + /** + * Create a new user instance after a valid registration. + * + * @param array $data + * + * @return \App\User + */ + protected function create(array $data) + { + return User::create([ + 'name' => $data['name'], + 'role' => User::ROLE_VISITOR, + 'state' => User::STATE_ACTIVE, + 'email' => $data['email'], + 'password' => bcrypt($data['password']), + ]); + } +} diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php new file mode 100644 index 00000000..44672583 --- /dev/null +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -0,0 +1,39 @@ +middleware('guest'); + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 4c01a2dd..a8b5a9c1 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -14,7 +14,6 @@ class Controller extends BaseController /** * Custom wrapper for generating view. - * * This method will be used for switching among templates. * * @param $template @@ -23,10 +22,25 @@ class Controller extends BaseController * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ - public static function VisitorsView($template, $data = [], $mergeData = []) + public static function visitorsView($template, $data = [], $mergeData = []) + { + $view = self::getView($template, $data, $mergeData); + + return response($view)->header('X-Powered-By', strrev('zc.ytiranib.www//:sptth | .o.r.s ytiranib | SMCiniM')); + } + + /** + * Get instance of view for passing into response + * + * @param $template + * @param $data + * @param $mergeData + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public static function getView($template, $data = [], $mergeData = []) { $view = Template::name($template); - - return response(view($view, $data, $mergeData))->header('X-Powered-By', strrev('zc.ytiranib.www//:sptth | .o.r.s ytiranib | SMCiniM')); + return view($view, $data, $mergeData); } } diff --git a/app/Http/Controllers/Visitor/ContentPage.php b/app/Http/Controllers/Visitor/ContentPage.php index 6610bb50..81635ee0 100644 --- a/app/Http/Controllers/Visitor/ContentPage.php +++ b/app/Http/Controllers/Visitor/ContentPage.php @@ -65,7 +65,7 @@ class ContentPage extends Controller $displayPipeline = app('displayPipeline'); $page = $displayPipeline->run($page); - return Controller::VisitorsView($page->template, ['page' => $page]); + return Controller::visitorsView($page->template, ['page' => $page]); } } diff --git a/app/Http/Controllers/Visitor/Homepage.php b/app/Http/Controllers/Visitor/Homepage.php index 38b77969..06e2b6a1 100644 --- a/app/Http/Controllers/Visitor/Homepage.php +++ b/app/Http/Controllers/Visitor/Homepage.php @@ -10,7 +10,7 @@ class Homepage extends ContentPage { // try to find some homepage $contentModel = $this->content; - $page = Cache::remember('hp', setting('homepageCacheLifetime', 5), function () use ($contentModel) { + $page = Cache::remember('homepage', setting('homepageCacheLifetime', 5), function () use ($contentModel) { return $contentModel->getHomepage(); }); diff --git a/app/Http/Controllers/Sitemap.php b/app/Http/Controllers/Visitor/Sitemap.php similarity index 96% rename from app/Http/Controllers/Sitemap.php rename to app/Http/Controllers/Visitor/Sitemap.php index fe5c4360..bcd4b3fe 100644 --- a/app/Http/Controllers/Sitemap.php +++ b/app/Http/Controllers/Visitor/Sitemap.php @@ -1,9 +1,9 @@ [ CheckForMaintenanceMode::class, + TemplateChecker::class, AddQueuedCookiesToResponse::class, + IncrementWidgetsViews::class, ], 'admin' => [ - Middleware\Authenticate::class, - Middleware\AdminMenuRegistrator::class, - TemplatePathInstaller::class, - WidgetInstaller::class, + Middleware\Admin\Authenticate::class, + Middleware\Admin\AdminMenuRegistrator::class, + Middleware\Admin\TemplatePathInstaller::class, + Middleware\Admin\WidgetInstaller::class, ], 'api' => [ 'throttle:60,1', @@ -53,19 +53,18 @@ class Kernel extends HttpKernel ]; /** * The application's route middleware. - * * These middleware may be assigned to groups or used individually. - * * @var array */ protected $routeMiddleware = [ - 'auth' => Middleware\Authenticate::class, - 'onlyAdmin' => Middleware\RequireAdminRole::class, - 'adminMenu' => Middleware\AdminMenuRegistrator::class, + 'can' => Authorize::class, + 'auth' => Middleware\Admin\Authenticate::class, + 'adminMenu' => Middleware\Admin\AdminMenuRegistrator::class, 'guest' => Middleware\RedirectIfAuthenticated::class, 'throttle' => ThrottleRequests::class, 'localize' => LaravelLocalizationRoutes::class, 'localizationRedirect' => LaravelLocalizationRedirectFilter::class, - 'localeSessionRedirect' => LocaleSessionRedirect::class + 'localeSessionRedirect' => LocaleSessionRedirect::class, + 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, ]; } diff --git a/app/Http/Middleware/AdminMenuRegistrator.php b/app/Http/Middleware/Admin/AdminMenuRegistrator.php similarity index 80% rename from app/Http/Middleware/AdminMenuRegistrator.php rename to app/Http/Middleware/Admin/AdminMenuRegistrator.php index ca591767..873b5bb2 100644 --- a/app/Http/Middleware/AdminMenuRegistrator.php +++ b/app/Http/Middleware/Admin/AdminMenuRegistrator.php @@ -1,9 +1,9 @@ get(); + $modules = app(ModuleRepository::class)->all(); // iterate over all enabled modules foreach ($modules as $key => $module) { - if (!is_callable([$module->handler, 'registerAdminMenu'])) + if (!is_callable([$module->handler, 'registerAdminMenu'])) { continue; + } // try to register menus try { diff --git a/app/Http/Middleware/Admin/Authenticate.php b/app/Http/Middleware/Admin/Authenticate.php new file mode 100644 index 00000000..a6daacf7 --- /dev/null +++ b/app/Http/Middleware/Admin/Authenticate.php @@ -0,0 +1,46 @@ +check() || Auth::user()->status != User::STATE_ACTIVE || Auth::user()->role == User::ROLE_VISITOR || 0) { + Auth::logout(); + + if ($request->ajax()) { + return response('Unauthorized.', 401); + } + + // select right message + if (Auth::user() && Auth::user()->status != User::STATE_ACTIVE) { + $message = 'auth.userNotActive'; + } elseif (Auth::user() && Auth::user()->role == User::ROLE_VISITOR) { + $message = 'auth.visitorInAdmin'; + } else { + $message = 'auth.loginExpired'; + } + + return redirect() + ->route('login') + ->with('warning', trans($message)); + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/TemplatePathInstaller.php b/app/Http/Middleware/Admin/TemplatePathInstaller.php similarity index 88% rename from app/Http/Middleware/TemplatePathInstaller.php rename to app/Http/Middleware/Admin/TemplatePathInstaller.php index d1c23267..1c2c741d 100644 --- a/app/Http/Middleware/TemplatePathInstaller.php +++ b/app/Http/Middleware/Admin/TemplatePathInstaller.php @@ -1,6 +1,6 @@ saveTemplates(); + $registator->deleteNonExistingPaths(); + return $next($request); } } diff --git a/app/Http/Middleware/WidgetInstaller.php b/app/Http/Middleware/Admin/WidgetInstaller.php similarity index 94% rename from app/Http/Middleware/WidgetInstaller.php rename to app/Http/Middleware/Admin/WidgetInstaller.php index 06eae5c3..0b495848 100644 --- a/app/Http/Middleware/WidgetInstaller.php +++ b/app/Http/Middleware/Admin/WidgetInstaller.php @@ -1,6 +1,6 @@ check()) { - if ($request->ajax()) { - return response('Unauthorized.', 401); - } - - return redirect() - ->route('login') - ->with('redirectTo', $request->fullUrl()); - } - - return $next($request); - } -} diff --git a/app/Http/Middleware/RequireAdminRole.php b/app/Http/Middleware/TemplateChecker.php similarity index 61% rename from app/Http/Middleware/RequireAdminRole.php rename to app/Http/Middleware/TemplateChecker.php index f0ea40b1..42c39dfc 100644 --- a/app/Http/Middleware/RequireAdminRole.php +++ b/app/Http/Middleware/TemplateChecker.php @@ -2,10 +2,10 @@ namespace App\Http\Middleware; -use App\Models\User; +use App\CMS\Helpers\CurrentTemplate; use Closure; -class RequireAdminRole +class TemplateChecker { /** * Handle an incoming request. @@ -17,10 +17,10 @@ class RequireAdminRole */ public function handle($request, Closure $next) { - if (\Auth::user()->role != User::ROLE_ADMIN) { - return redirect() - ->back() - ->with('error', trans('auth.accessDenied')); + $template = CurrentTemplate::get(); + + if (!$template) { + throw new \ErrorException('Template is not set, cannot continue'); } return $next($request); diff --git a/app/Http/Middleware/Web/IncrementWidgetsViews.php b/app/Http/Middleware/Web/IncrementWidgetsViews.php new file mode 100644 index 00000000..84b4e8d3 --- /dev/null +++ b/app/Http/Middleware/Web/IncrementWidgetsViews.php @@ -0,0 +1,36 @@ +increment('viewed'); + } + } +} diff --git a/app/Http/routes.php b/app/Http/routes.php deleted file mode 100644 index c648aaf7..00000000 --- a/app/Http/routes.php +++ /dev/null @@ -1,75 +0,0 @@ - LaravelLocalization::setLocale()], function () { - /** - * This route group serves to handle request in admin - */ - Route::group([ - 'middleware' => ['admin'], - 'namespace' => 'Admin', - 'prefix' => 'admin' - ], function () { - - // include all routes in routes/admin subfolder - $files = ['contents', 'fileManager', 'settings', 'templates', 'users', 'widgets']; - foreach ($files as $file) { - require_once __DIR__ . DIRECTORY_SEPARATOR . 'routes' . DIRECTORY_SEPARATOR . 'admin' . DIRECTORY_SEPARATOR . $file . '.php'; - } - - // display dashboard with some usefull information - Route::get('/', 'Dashboard\Dashboard@index') - ->name('admin.dashboard'); - - // list of all actions - Route::get('actions', 'ActionLog\Overview@index') - ->name('log.overview'); - - // search form with results - Route::get('search', 'Search@getSearch') - ->name('search'); - - // logout method - Route::get('logout', 'Login@logout') - ->name('logout'); - }); - - /**************************************************************************************/ - - /** - * This section must be specified as last one - */ - - Route::group(['middleware' => ['web']], function () { - - // Homepage - Route::get('/', 'Visitor\Homepage@getIndex') - ->name('page.index'); - - // display login form - Route::get('admin/login', 'Admin\Login@getLogin') - ->name('loginForm'); - - // handle login - Route::post('admin/login', 'Admin\Login@postLogin') - ->name('login'); - - // route for sitemap - Route::get('sitemap.xml', 'Sitemap@getMap') - ->name('sitemap'); - - // route for all content pages. This rule must be specified last (because it matches every route) - Route::get('{url}', 'Visitor\ContentPage@getPage') - ->name('page.content'); - }); -}); \ No newline at end of file diff --git a/app/Http/routes/admin/contents.php b/app/Http/routes/admin/contents.php deleted file mode 100644 index 54b70c6b..00000000 --- a/app/Http/routes/admin/contents.php +++ /dev/null @@ -1,42 +0,0 @@ - 'Contents'], function () { - // list of all static pages - Route::get('content/overview/{module?}', 'ContentOverview@index') - ->name('content.overview'); - - // form for creating new static page - Route::get('content/new/{module}', 'CreateNewContent@create') - ->name('content.new'); - - // form for editing existing static page - Route::get('content/edit/{id}', 'EditContent@edit') - ->name('content.edit'); - - // post method for creating new static page - Route::post('content/new/{moduleId}', 'CreateNewContent@store') - ->name('content.newPost'); - - // post method for creating new static page - Route::post('content/edit/{id}', 'EditContent@update') - ->name('content.editPost'); - - // change status of page (protected, public or draft) - Route::get('content/status/{id}/{status}', 'ContentActions@changeStatus') - ->name('content.changeStatus'); - - // set homepage - Route::get('content/homepage/{id}', 'ContentActions@setHomepage') - ->name('content.setHomepage'); - - // delete page - Route::get('content/delete/{id}', 'ContentActions@delete') - ->name('content.delete'); - - // history of changes for specified page - Route::get('history/{id}', 'History@getOverview') - ->name('content.history'); - - // history of changes for specified page - Route::get('history/{revision}/{id}', 'History@getDiff') - ->name('history.diff'); -}); \ No newline at end of file diff --git a/app/Http/routes/admin/fileManager.php b/app/Http/routes/admin/fileManager.php deleted file mode 100644 index ec85fc37..00000000 --- a/app/Http/routes/admin/fileManager.php +++ /dev/null @@ -1,32 +0,0 @@ - 'FileManager'], function () { - - Route::get('files/overview/{directory?}', 'UploadedFilesOverview@index') - ->name('upload.overview'); - - // uploader methods - Route::get('directories/new/{parentDirectory?}', 'CreateNewDirectory@create') - ->name('upload.newDirectory'); - - Route::get('directories/edit/{directory}', 'EditDirectory@edit') - ->name('upload.editDirectory'); - - Route::post('directories/edit/{directory}', 'EditDirectory@update') - ->name('upload.postEditDirectory'); - - route::post('directories/new', 'CreateNewDirectory@store') - ->name('upload.postNewDirectory'); - - Route::get('upload/detail/{file}', 'EditUploadedFile@show') - ->name('upload.detail'); - - Route::post('upload/detail/{file}', 'EditUploadedFile@update') - ->name('upload.postEdit'); - - Route::get('upload/delete/{file}', 'EditUploadedFile@delete') - ->name('upload.delete'); - - // uploader methods - Route::post('upload', 'UploadFile@store') - ->name('upload.postFile'); -}); diff --git a/app/Http/routes/admin/settings.php b/app/Http/routes/admin/settings.php deleted file mode 100644 index 70b2b996..00000000 --- a/app/Http/routes/admin/settings.php +++ /dev/null @@ -1,7 +0,0 @@ -name('settings.overview'); - -Route::post('settings', 'Settings@saveSettings') - ->name('settings.save'); \ No newline at end of file diff --git a/app/Http/routes/admin/templates.php b/app/Http/routes/admin/templates.php deleted file mode 100644 index bb265533..00000000 --- a/app/Http/routes/admin/templates.php +++ /dev/null @@ -1,15 +0,0 @@ - 'onlyAdmin', 'namespace' => 'Templates'], function () { - Route::get('templates/overview/path/{id}', 'TemplateOverview@getPath') - ->name('templates.overview'); - - Route::post('templates/copy', 'CopyTemplate@createCopy') - ->name('templates.postCopy'); - - Route::get('templates/edit/{id}', 'EditTemplate@getEdit') - ->name('templates.edit'); - - Route::post('templates/edit/{id}', 'EditTemplate@postEdit') - ->name('templates.postEdit'); -}); \ No newline at end of file diff --git a/app/Http/routes/admin/users.php b/app/Http/routes/admin/users.php deleted file mode 100644 index 69d643f7..00000000 --- a/app/Http/routes/admin/users.php +++ /dev/null @@ -1,27 +0,0 @@ - 'Users'], function () { - // display form for creating new user - Route::get('users/new', 'CreateNewUser@getNewUser') - ->name('users.new'); - - // POST methods - // display form for creating new user - Route::post('users/new', 'CreateNewUser@postRegistration') - ->name('users.newPost'); - - // display form for edit of existing user - Route::get('users/edit/{id}', 'EditUser@getEditUser') - ->name('users.edit'); - - // display user detail in admin - Route::get('users/detail/{id?}', 'UserDetail@getDetail') - ->name('users.detail'); - - // method for saving edited data of user - Route::post('users/edit/{id}', 'EditUser@postEdit') - ->name('users.editPost'); - - // display list of all users registered into our system - Route::get('users/overview/{state?}/{perPage?}', 'UsersOverview@getOverview') - ->name('users.overview'); -}); diff --git a/app/Http/routes/admin/widgets.php b/app/Http/routes/admin/widgets.php deleted file mode 100644 index d10df3fd..00000000 --- a/app/Http/routes/admin/widgets.php +++ /dev/null @@ -1,60 +0,0 @@ - 'Widgets'], function () { - - // list of all installed widget types - Route::get('widgets/overview', 'WidgetsOverview@getOverview') - ->name('widgets.overview'); - - // create new instance of widget of given type - Route::get('widgets/new/{type}', 'CreateNewWidget@getNew') - ->name('widgets.new'); - - Route::post('widgets/new/{type}', 'CreateNewWidget@postNew') - ->name('widgets.postNew'); - - // edit widget settings - Route::get('widgets/edit/{id}', 'EditWidget@getEdit') - ->name('widgets.edit'); - - // delete widget settings - Route::get('widgets/delete/{id}', 'EditWidget@deleteWidget') - ->name('widgets.delete'); - - Route::post('widgets/edit/{id}', 'EditWidget@postEdit') - ->name('widgets.postEdit'); - - // display form for association of widget and widget area - Route::get('widgets/associate/{widgetArea}', 'AssociateWidget@getList') - ->name('widgets.associate'); - - Route::get('widgets/deassociate/{widgetId}/{widgetArea}', 'AssociateWidget@deleteAssociation') - ->name('widgets.deleteAssociation'); - - Route::get('widgets/associate/{widgetId}/{widgetArea}', 'AssociateWidget@makeAssociation') - ->name('widgets.makeAssociation'); - - Route::group(['namespace' => 'Areas'], function () { - Route::get('widgets/areas/overview', 'WidgetAreaOverview@getOverview') - ->name('widgetareas.overview'); - - // form for new widget area - Route::get('widgets/areas/new', 'CreateNewWidgetArea@getNew') - ->name('widgetareas.new'); - - // form for new widget area - Route::post('widgets/areas/new', 'CreateNewWidgetArea@postNew') - ->name('widgetareas.postNew'); - - // edit form for widget area - Route::get('widgets/areas/edit/{id}', 'EditWidgetArea@getEdit') - ->name('widgetareas.edit'); - - Route::post('widgets/areas/edit/{id}', 'EditWidgetArea@postEdit') - ->name('widgetareas.postEdit'); - - // edit form for widget area - Route::get('widgets/areas/delete/{id}', 'EditWidgetArea@deleteArea') - ->name('widgetareas.delete'); - }); -}); diff --git a/app/Listeners/CreateImageThumbnail.php b/app/Listeners/CreateImageThumbnail.php index 07ff6145..c569645c 100644 --- a/app/Listeners/CreateImageThumbnail.php +++ b/app/Listeners/CreateImageThumbnail.php @@ -3,23 +3,16 @@ namespace App\Listeners; use App\Events\UploadFile; +use App\Models\FileManager\File; +use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Support\Facades\File as FileFacade; use Illuminate\Support\Str; use Intervention\Image\Constraint; use Intervention\Image\Facades\Image; use Symfony\Component\HttpFoundation\File\File as SymphonyFile; -class CreateImageThumbnail +class CreateImageThumbnail implements ShouldQueue { - /** - * Create the event listener. - * - * @return void - */ - public function __construct() - { - } - /** * Handle the event. * @@ -29,10 +22,10 @@ class CreateImageThumbnail */ public function handle(UploadFile $event) { - $uploadedFile = $event->uploadedFile; + $uploadedFile = $event->file; // is uploaded file an image? - if (!Str::startsWith($uploadedFile->getMimeType(), 'image')) { + if (!Str::startsWith($uploadedFile->mime_type, 'image')) { return; } // yes, create thumbnail @@ -42,10 +35,12 @@ class CreateImageThumbnail /** * Create thumbnail of given image * - * @param SymphonyFile $file + * @param File $uploadedFile */ - private function createThumbnail(SymphonyFile $file) + private function createThumbnail(File $uploadedFile) { + $file = new SymphonyFile(config('app.upload_path') . '/' . $uploadedFile->filename); + // does thumbnail directory exist? if (!is_dir(config('app.thumbnail_path'))) { FileFacade::makeDirectory(config('app.thumbnail_path')); @@ -61,6 +56,6 @@ class CreateImageThumbnail }); // save thumbnail with lower quality - $image->save(config('app.thumbnail_path') . DIRECTORY_SEPARATOR . $file->getFilename(), 75); + $image->save(config('app.thumbnail_path') . DIRECTORY_SEPARATOR . $file->getFilename(), setting('previewQuality', 75)); } } diff --git a/app/Listeners/Loggers/LogLogout.php b/app/Listeners/Loggers/LogLogout.php index 6ca608bf..abda7140 100644 --- a/app/Listeners/Loggers/LogLogout.php +++ b/app/Listeners/Loggers/LogLogout.php @@ -3,19 +3,22 @@ namespace App\Listeners\Loggers; use Illuminate\Auth\Events\Logout; -use Illuminate\Queue\InteractsWithQueue; -use Illuminate\Contracts\Queue\ShouldQueue; class LogLogout extends Logger { /** * Handle the event. * - * @param Logout $event + * @param Logout $event + * * @return void */ public function handle(Logout $event) { + if (is_null($event->user)) { + return; + } + $parameters = [ 'id' => $event->user->id, 'name' => $event->user->name, @@ -27,7 +30,6 @@ class LogLogout extends Logger /** * Getter for action name. Used only internally - * * @return mixed */ protected function getName() diff --git a/app/Listeners/Loggers/LogUploadFile.php b/app/Listeners/Loggers/LogUploadFile.php index 38dac179..14a4f627 100644 --- a/app/Listeners/Loggers/LogUploadFile.php +++ b/app/Listeners/Loggers/LogUploadFile.php @@ -2,30 +2,33 @@ namespace App\Listeners\Loggers; -use App\Events\Uploadfile; -use Illuminate\Queue\InteractsWithQueue; -use Illuminate\Contracts\Queue\ShouldQueue; +use App\Events\UploadFile; -class LogUploadFile +class LogUploadFile extends Logger { - /** - * Create the event listener. - * - * @return void - */ - public function __construct() - { - // - } - /** * Handle the event. * - * @param Uploadfile $event + * @param CreateNewWidget $event + * * @return void */ - public function handle(Uploadfile $event) + public function handle(UploadFile $event) { - // + $parameters = [ + 'name' => $event->file->filename, + 'mime' => $event->file->mime_type, + ]; + + $this->saveLog($parameters); + } + + /** + * Getter for action name. Used only internally + * @return mixed + */ + protected function getName() + { + return 'newFile'; } } diff --git a/app/Listeners/SetDefaultPermissions.php b/app/Listeners/SetDefaultPermissions.php new file mode 100644 index 00000000..66f3e5c1 --- /dev/null +++ b/app/Listeners/SetDefaultPermissions.php @@ -0,0 +1,27 @@ +get(); + + foreach ($permissions as $permission) { + $event->user->permissions() + ->attach($permission); + } + } +} diff --git a/app/Models/Content/Content.php b/app/Models/Content/Content.php index e016392b..052ff9d3 100644 --- a/app/Models/Content/Content.php +++ b/app/Models/Content/Content.php @@ -6,6 +6,8 @@ use App\CMS\Contracts\Repositories\Content as ContentContract; use App\CMS\Helpers\Traits\Nullable; use App\CMS\Observers\Content as ContentObserver; use App\Models\FileManager\File; +use App\Models\Module; +use App\Models\Templates\Template; use App\Models\User; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; @@ -32,6 +34,7 @@ class Content extends Model 'isHomepage', 'title', 'url', + 'order', 'metaKeywords', 'metaDescription', 'pageContent', @@ -55,7 +58,6 @@ class Content extends Model /** * Mark relationship with its historical records - * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function history() @@ -63,9 +65,12 @@ class Content extends Model return $this->hasMany(ContentHistory::class); } + public function templateModel() { + return $this->belongsTo(Template::class, 'template', 'template_name'); + } + /** * Mark relationship with users table - * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function author() @@ -75,7 +80,6 @@ class Content extends Model /** * Related files to content page - * * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany */ public function files() @@ -85,27 +89,54 @@ class Content extends Model /** * Category of content page - * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function category() { + if (!class_exists(Category::class)) { + throw new \ErrorException('Categories are not installed'); + } + return $this->belongsTo(Category::class); } /** * Subpages assigned to page - * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function subpages() { - return $this->hasMany(Content::class, 'parentId'); + return $this->hasMany(Content::class, 'parentId')->orderBy('order')->orderBy('created_at', 'DESC'); + } + + /** + * Subpages assigned to page + * @return \Illuminate\Database\Eloquent\Relations\HasMany + */ + public function publishedSubpages() + { + $query = $this->subpages(); + + if (\Auth::check()) { + $query = $query->where('status', '!=', ContentContract::STATUS_DRAFT); + } else { + $query = $query->where('status', ContentContract::STATUS_PUBLIC); + } + + return $query; + } + + /** + * Module relationship + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function module() + { + return $this->belongsTo(Module::class, 'moduleHandler', 'handler'); } /** * Parent page - * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function parentPage() @@ -115,7 +146,6 @@ class Content extends Model /** * Is current content draft? - * * @return bool */ public function isDraft() @@ -125,7 +155,6 @@ class Content extends Model /** * Is current content visible for all visitors? - * * @return bool */ public function isPublic() @@ -135,7 +164,6 @@ class Content extends Model /** * Is current content visible only for logged users? - * * @return bool */ public function isProtected() @@ -145,7 +173,6 @@ class Content extends Model /** * Is current content visible for logged user OR for everyone? - * * @return bool */ public function isVisible() @@ -164,6 +191,9 @@ class Content extends Model return parent::save($options); } + /** + * Increment number of viewed content + */ public function view() { $this->timestamps = false; diff --git a/app/Models/Content/ContentHistory.php b/app/Models/Content/ContentHistory.php index dca25307..b81d4c59 100644 --- a/app/Models/Content/ContentHistory.php +++ b/app/Models/Content/ContentHistory.php @@ -2,6 +2,7 @@ namespace App\Models\Content; +use App\Models\User; use Illuminate\Database\Eloquent\Model; /** @@ -21,5 +22,14 @@ class ContentHistory extends Model 'new_value', 'old_value' ]; - protected $guarded = []; + + /** + * Author of the change + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function author() + { + return $this->belongsTo(User::class, 'user_id'); + } } \ No newline at end of file diff --git a/app/Models/FileManager/ModelTraits/File.php b/app/Models/FileManager/ModelTraits/File.php index 759c6bf6..3da83ec9 100644 --- a/app/Models/FileManager/ModelTraits/File.php +++ b/app/Models/FileManager/ModelTraits/File.php @@ -6,6 +6,7 @@ use App\Events\UploadFile; use App\Models\FileManager\File as FileModel; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Event; +use Illuminate\Support\Facades\Gate; use Symfony\Component\HttpFoundation\File\File as SymphonyFile; use Symfony\Component\HttpFoundation\File\UploadedFile; @@ -36,6 +37,8 @@ trait File */ public function upload(UploadedFile $file, $data = []) { + abort_unless(Auth::user()->can('upload', FileModel::class), 403); + $data = (object)$data; $destination = config('app.upload_path'); @@ -45,15 +48,15 @@ trait File $uploadedFile = $file->move($destination, $filename); // insert record into database - $id = $this->saveIntoDatabase($uploadedFile, $data, $file->getClientOriginalName()); + $fileInDB = $this->saveIntoDatabase($uploadedFile, $data, $file->getClientOriginalName()); // fire event about new file - Event::fire(new UploadFile($uploadedFile, $id)); + Event::fire(new UploadFile($fileInDB)); return [ 'filename' => $filename, 'file' => $file, - 'id' => $id + 'id' => $fileInDB->id ]; } @@ -89,6 +92,6 @@ trait File 'keywords' => isset($request->keyword) ? $request->keyword : '' ]); - return $newFile->id; + return $newFile; } } \ No newline at end of file diff --git a/app/Models/ModelTraits/Module.php b/app/Models/ModelTraits/Module.php deleted file mode 100644 index a60cfd61..00000000 --- a/app/Models/ModelTraits/Module.php +++ /dev/null @@ -1,113 +0,0 @@ -has_submodules = true; - $parentModule->save(); - } - - // insert module into database - $module = ModuleModel::create([ - 'name' => $name, - 'description' => $description, - 'handler' => $handler, - 'manages_content' => $managesContent, - 'support_categories' => $supportCategories, - 'alias' => $alias, - 'module_settings' => json_encode($settings), - 'parent_id' => $parentModuleId ? $parentModuleId : null, - 'enabled' => 1, - 'is_template' => $isTemplate - ]); - - // install something module-specific - if ($handler && is_callable([$handler, 'install'])) { - call_user_func([$handler, 'install']); - } - - return $module; - } - - /** - * Delete module from database and uninstall its dependencies - * - * @throws \ErrorException - */ - public function uninstall() - { - // check if user does not want to install module in runtime - if (!App::runningInConsole()) { - throw new \ErrorException('Modules can be uninstalled only via Artisan!'); - } - - // delete everything in /resources/views/visitor - if ($this->is_template) { - $this->deleteDirectory(resource_path('views/visitor')); - $this->deleteDirectory(resource_path('views/modules')); - $this->deleteDirectory(public_path('assets')); - - // delete all template paths - TemplatePath::getQuery() - ->delete(); - } - - if ($this->handler && is_callable([$this->handler, 'uninstall'])) { - call_user_func([$this->handler, 'uninstall'], $this); - } - - $this->delete(); - } - - /** - * Delete directory when uninstalling module. - * - * @param $directory - * - * @throws \ErrorException - */ - private function deleteDirectory($directory) - { - if (!is_dir($directory)) { - return; - } - - $success = \File::deleteDirectory($directory, true); - - if (!$success) { - throw new \ErrorException('Cannot delete ' . $directory); - } - } -} \ No newline at end of file diff --git a/app/Models/Module.php b/app/Models/Module.php index f6940aad..8b56b74d 100644 --- a/app/Models/Module.php +++ b/app/Models/Module.php @@ -9,13 +9,13 @@ use Illuminate\Database\Eloquent\Model; */ class Module extends Model { - use ModelTraits\Module; public $timestamps = false; protected $fillable = [ 'handler', 'parent_id', 'name', 'description', + 'static_name', 'alias', 'module_settings', 'enabled', @@ -23,4 +23,23 @@ class Module extends Model 'manages_content', 'is_template' ]; + protected $casts = [ + 'module_settings' => 'array', + 'is_template' => 'boolean', + 'has_submodules' => 'boolean' + ]; + + public function getRouteKeyName() + { + return 'alias'; + } + + public function submodules() + { + return $this->hasMany(Module::class, 'parent_id'); + } + + public function parent() { + return $this->belongsTo(Module::class, 'parent_id'); + } } \ No newline at end of file diff --git a/app/Models/Permissions/Permission.php b/app/Models/Permissions/Permission.php new file mode 100644 index 00000000..fd4d1ed0 --- /dev/null +++ b/app/Models/Permissions/Permission.php @@ -0,0 +1,40 @@ + 'boolean' + ]; + + /** + * Assign observer for this model for logging + */ + protected static function boot() + { + parent::boot(); + + self::observe(PermissionObserver::class); + } + + public function parent() + { + return $this->hasOne(Permission::class, 'parent_id'); + } + + public function subpermissions() + { + return $this->hasMany(Permission::class, 'parent_id'); + } +} diff --git a/app/Models/Permissions/PermissionObserver.php b/app/Models/Permissions/PermissionObserver.php new file mode 100644 index 00000000..f52fb18e --- /dev/null +++ b/app/Models/Permissions/PermissionObserver.php @@ -0,0 +1,26 @@ +default) { + $users = User::where('role', '!=', User::ROLE_VISITOR) + ->get(); + + foreach ($users as $user) { + $user->permissions() + ->attach($permission->id); + } + } + } +} \ No newline at end of file diff --git a/app/Models/Settings.php b/app/Models/Settings.php index 5ab99456..ecf7c313 100644 --- a/app/Models/Settings.php +++ b/app/Models/Settings.php @@ -3,12 +3,9 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; -use Mcamara\LaravelLocalization\Facades\LaravelLocalization; class Settings extends Model { - use ModelTraits\Settings; - protected $table = 'settings'; public $timestamps = false; protected $fillable = ['key', 'value', 'language']; diff --git a/app/Models/User.php b/app/Models/User.php index 35d4911f..b0db4a04 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -2,18 +2,29 @@ namespace App\Models; +use App\Models\Permissions\Permission; +use App\Notifications\ResetPasswordNotification; use Illuminate\Auth\Authenticatable; use Illuminate\Contracts\Auth\Authenticatable as AuthenticableInterface; +use Illuminate\Contracts\Auth\CanResetPassword; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Foundation\Auth\Access\Authorizable; +use Illuminate\Notifications\Notifiable; /** * Class User */ -class User extends Model implements AuthenticableInterface +class User extends Model implements AuthenticableInterface, CanResetPassword { - use SoftDeletes, Authenticatable, Authorizable; + use SoftDeletes, Authenticatable, Authorizable, Notifiable; + const STATE_DELETED = 'deleted'; + const STATE_BLOCKED = 'blocked'; + const STATE_ACTIVE = 'active'; + const ROLE_VISITOR = 'visitor'; + const ROLE_EDITOR = 'editor'; + const ROLE_ADMIN = 'admin'; + protected static $abilities; public $timestamps = true; protected $fillable = [ 'email', @@ -24,17 +35,52 @@ class User extends Model implements AuthenticableInterface ]; /** * The attributes excluded from the model's JSON form. - * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; - const STATE_DELETED = 'deleted'; - const STATE_BLOCKED = 'blocked'; - const STATE_ACTIVE = 'active'; - const ROLE_VISITOR = 'visitor'; - const ROLE_EDITOR = 'editor'; - const ROLE_ADMIN = 'admin'; + + /** + * Get the e-mail address where password reset links are sent. + * @return string + */ + public function getEmailForPasswordReset() + { + return $this->email; + } + + /** + * Send the password reset notification. + * + * @param string $token + * + * @return void + */ + public function sendPasswordResetNotification($token) + { + $this->notify(new ResetPasswordNotification($token)); + } + + public function permissions() + { + return $this->belongsToMany(Permission::class, 'user_has_permissions'); + } + + /** + * Check if current user has given ability + * + * @param $ability + * + * @return bool + */ + public function hasAbility($ability) + { + if (!isset(self::$abilities[$this->id])) { + self::$abilities[$this->id] = $this->permissions->pluck('string_id')->toArray(); + } + + return in_array($ability, self::$abilities[$this->id]); + } } diff --git a/app/Models/Widgets/ModelTraits/Widget.php b/app/Models/Widgets/ModelTraits/Widget.php deleted file mode 100644 index 82f1c263..00000000 --- a/app/Models/Widgets/ModelTraits/Widget.php +++ /dev/null @@ -1,41 +0,0 @@ -handler, 'save'], $request); - - // create new widget - $widget = WidgetModel::create([ - 'widget_type_handler' => $widgetType->handler, - 'language' => LaravelLocalization::getCurrentLocale(), - 'user_id' => \Auth::user()->id, - 'name' => $request->name, - 'container_class' => $request->containerClass, - 'container_id' => empty($request->containerId) ? null : $request->containerId, - 'description' => $request->description, - 'settings' => json_encode($settings), - ]); - - // fire event with newly created widget - \Event::fire(new CreateNewWidget($widget)); - - return $widget; - } -} \ No newline at end of file diff --git a/app/Models/Widgets/ModelTraits/WidgetArea.php b/app/Models/Widgets/ModelTraits/WidgetArea.php deleted file mode 100644 index f457fb35..00000000 --- a/app/Models/Widgets/ModelTraits/WidgetArea.php +++ /dev/null @@ -1,24 +0,0 @@ -join('widget_in_widget_area', 'widget_in_widget_area.widget_id', '=', 'widgets.id') - ->join('widget_areas', 'widget_in_widget_area.widget_area_id', '=', 'widget_areas.id') - ->where('language', LaravelLocalization::getCurrentLocale()) - ->orderBy('widget_in_widget_area.position'); - if (!$uniqueCode) { - $widgets = $widgets->where('widget_areas.viewed', '>=', setting('preloadFrequentedWidgetAreasTreshold', 10)); - } else { - $widgets = $widgets->where('code', $uniqueCode); - } - - return $widgets; - } -} \ No newline at end of file diff --git a/app/Models/Widgets/Widget.php b/app/Models/Widgets/Widget.php index fdb27d56..b4f25fff 100644 --- a/app/Models/Widgets/Widget.php +++ b/app/Models/Widgets/Widget.php @@ -22,4 +22,9 @@ class Widget extends Model 'viewed', 'deletable' ]; + + protected $casts = [ + 'settings' => 'object', + 'deletable' => 'boolean', + ]; } \ No newline at end of file diff --git a/app/Models/Widgets/WidgetArea.php b/app/Models/Widgets/WidgetArea.php index 2e32cb5b..d326783a 100644 --- a/app/Models/Widgets/WidgetArea.php +++ b/app/Models/Widgets/WidgetArea.php @@ -3,19 +3,24 @@ namespace App\Models\Widgets; use Illuminate\Database\Eloquent\Model; +use Mcamara\LaravelLocalization\Facades\LaravelLocalization; /** * Class WidgetArea */ class WidgetArea extends Model { - use ModelTraits\WidgetArea; - - public $timestamps = false; + public $timestamps = true; protected $fillable = [ 'name', 'code', 'description', 'deletable' ]; + + public function widgets() + { + return $this->hasMany(Widget::class) + ->where('language', LaravelLocalization::getCurrentLocale()); + } } \ No newline at end of file diff --git a/app/Notifications/ResetPasswordNotification.php b/app/Notifications/ResetPasswordNotification.php new file mode 100644 index 00000000..03418cda --- /dev/null +++ b/app/Notifications/ResetPasswordNotification.php @@ -0,0 +1,52 @@ +token = $token; + } + + /** + * Get the notification's delivery channels. + * + * @param mixed $notifiable + * + * @return array + */ + public function via($notifiable) + { + return ['mail']; + } + + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($notifiable) + { + $url = route('password.reset', ['token' => $this->token, 'email' => $notifiable->email]); + + return (new MailMessage())->subject(trans('notification.forgottenPassword.subject')) + ->line(trans('notification.forgottenPassword.firstLine')) + ->action(trans('notification.forgottenPassword.button'), $url) + ->line(trans('notification.forgottenPassword.lastLine')); + } +} diff --git a/app/Policies/ActionLogPolicy.php b/app/Policies/ActionLogPolicy.php new file mode 100644 index 00000000..7522281d --- /dev/null +++ b/app/Policies/ActionLogPolicy.php @@ -0,0 +1,11 @@ +manage($user)) { + return false; + } + } + + /** + * Can user manage given entity? + * + * @param User $user + * + * @return bool + */ + public function manage(User $user) + { + return $user->hasAbility($this->entity . '-management'); + } + + /** + * Determine whether the user can delete the content. + * + * @param \App\Models\User $user + * @param Model $model + * + * @return mixed + */ + public function delete(User $user, Model $model) + { + return $user->hasAbility('delete-' . $this->entity); + } +} diff --git a/app/Policies/ContentPolicy.php b/app/Policies/ContentPolicy.php new file mode 100644 index 00000000..1ee72ca6 --- /dev/null +++ b/app/Policies/ContentPolicy.php @@ -0,0 +1,118 @@ +id != $content->user_id) { + return $user->hasAbility('update-contents') && $user->hasAbility('update-all-contents'); + }; + + return $user->hasAbility('update-contents'); + } + + /** + * Does given user has permissions to create new content page? + * + * @param User $user + * + * @return bool + */ + public function create(User $user) + { + return $user->hasAbility('create-contents'); + } + + /** + * Change page status + * + * @param User $user + * @param Content $page + * @param $status + * + * @return bool + */ + public function changeStatus(User $user, Content $page, $status) + { + switch ($status) { + case ContentContract::STATUS_PUBLIC: + return $this->publish($user, $page); + break; + case ContentContract::STATUS_DRAFT: + return $this->draft($user, $page); + break; + case ContentContract::STATUS_PROTECTED: + return $this->protect($user, $page); + break; + } + + return false; + } + + /** + * Can user publish given page? + * + * @param User $user + * @param Content $page + * + * @return bool + */ + public function publish(User $user, Content $page) + { + return $user->hasAbility('publish-contents'); + } + + /** + * Can user make draft from given page? + * + * @param User $user + * @param Content $page + * + * @return bool + */ + public function draft(User $user, Content $page) + { + return $user->hasAbility('draft-contents'); + } + + /** + * Can user publish page only for protected users? + * + * @param User $user + * @param Content $page + * + * @return bool + */ + public function protect(User $user, Content $page) + { + return $user->hasAbility('protect-contents'); + } + + public function setHomepage(User $user) + { + return $user->hasAbility('set-homepage-contents'); + } + + public function viewHistory(User $user) + { + return $user->hasAbility('view-history-contents'); + } +} diff --git a/app/Policies/DirectoriesPolicy.php b/app/Policies/DirectoriesPolicy.php new file mode 100644 index 00000000..97cb6da4 --- /dev/null +++ b/app/Policies/DirectoriesPolicy.php @@ -0,0 +1,36 @@ +hasAbility('create-directories'); + } + + /** + * Determine whether the user can update the directory. + * + * @param \App\Models\User $user + * @param \App\Directory $directory + * @return mixed + */ + public function update(User $user, Directory $directory) + { + return $user->hasAbility('update-directories'); + } +} diff --git a/app/Policies/FilesPolicy.php b/app/Policies/FilesPolicy.php new file mode 100644 index 00000000..7c8e5545 --- /dev/null +++ b/app/Policies/FilesPolicy.php @@ -0,0 +1,39 @@ +hasAbility('upload-files'); + } + + /** + * Determine whether the user can update the appModelsFileManagerFile. + * + * @param User $user + * @param File $file + * + * @return mixed + */ + public function update(User $user, File $file) + { + return $user->hasAbility('update-files'); + } +} diff --git a/app/Policies/ModulePolicy.php b/app/Policies/ModulePolicy.php new file mode 100644 index 00000000..7c4d387d --- /dev/null +++ b/app/Policies/ModulePolicy.php @@ -0,0 +1,27 @@ +hasAbility('create-contents-' . $module->alias); + } +} diff --git a/app/Policies/SettingsPolicy.php b/app/Policies/SettingsPolicy.php new file mode 100644 index 00000000..6b0ff0e5 --- /dev/null +++ b/app/Policies/SettingsPolicy.php @@ -0,0 +1,11 @@ +hasAbility('copy-templates'); + } + + /** + * Determine whether the user can update the template. + * + * @param \App\Models\User $user + * @param \App\Template $template + * + * @return mixed + */ + public function update(User $user, Template $template) + { + return $user->hasAbility('edit-templates'); + } +} diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php new file mode 100644 index 00000000..eb6dd2b7 --- /dev/null +++ b/app/Policies/UserPolicy.php @@ -0,0 +1,111 @@ +id == $user->id) + return true; + + return $this->manage($currentUser); + } + + /** + * Can current user updates other users (or himself?) + * + * @param User $currentUser + * @param User $user + * + * @return bool + */ + public function update(User $currentUser, User $user) + { + return $currentUser->id == $user->id || $currentUser->hasAbility('update-users'); + } + + /** + * Can user create other users? + * + * @param User $user + * + * @return bool + */ + public function create(User $user) { + return $user->hasAbility('create-users'); + } + + /** + * Does current user has permissions for setting permissions to other users? + * + * @param User $currentUser + * @param User $user + * + * @return bool + */ + public function setPermissions(User $currentUser, User $user) + { + if ($currentUser->id == $user->id || $user->role == User::ROLE_VISITOR) { + return false; + } + + return $currentUser->hasAbility('set-permissions-users'); + } + + /** + * Can logged user change status of other users? + * + * @param User $currentUser + * @param User $user + * + * @return bool + */ + public function changeStatus(User $currentUser, User $user) + { + if ($currentUser->id == $user->id) { + return false; + } + + return $currentUser->hasAbility('change-status-users'); + } + + /** + * Can current user change role of other users? + * + * @param User $currentUser + * @param User $user + * + * @return bool + */ + public function changeRole(User $currentUser, User $user) + { + if ($currentUser->id == $user->id) { + return false; + } + + return $currentUser->hasAbility('change-role-users'); + } +} diff --git a/app/Policies/WidgetAreaPolicy.php b/app/Policies/WidgetAreaPolicy.php new file mode 100644 index 00000000..cb16bd8f --- /dev/null +++ b/app/Policies/WidgetAreaPolicy.php @@ -0,0 +1,36 @@ +hasAbility('create-widgetareas'); + } + + /** + * Determine whether the user can update the widgetArea. + * + * @param \App\Models\User $user + * @param \App\WidgetArea $widgetArea + * @return mixed + */ + public function update(User $user, WidgetArea $widgetArea) + { + return $user->id == $widgetArea->user_id || $user->hasAbility('edit-widgetareas'); + } +} diff --git a/app/Policies/WidgetsPolicy.php b/app/Policies/WidgetsPolicy.php new file mode 100644 index 00000000..9d73f927 --- /dev/null +++ b/app/Policies/WidgetsPolicy.php @@ -0,0 +1,48 @@ +hasAbility('create-widgets'); + } + + /** + * Determine whether the user can update the widget. + * + * @param \App\Models\User $user + * @param \App\Widget $widget + * + * @return mixed + */ + public function update(User $user, Widget $widget) + { + return $user->id == $widget->user_id || $user->hasAbility('edit-widgets'); + } + + public function assign(User $user) + { + return $user->hasAbility('assign-widgets'); + } + + public function unassign(User $user) + { + return $user->hasAbility('unassign-widgets'); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index e25b2de4..39c11cbb 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -25,11 +25,10 @@ use App\CMS\Repositories\Module as ModuleRepository; use App\CMS\Repositories\Templates\Template as TemplateRepository; use App\CMS\Widgets\HtmlCode\HtmlCode; use App\CMS\Widgets\Menu\Menu; +use App\CMS\Widgets\SocialButtons\SocialButtons; use Barryvdh\Debugbar\ServiceProvider as DebugBarServiceProvider; use Illuminate\Support\Facades\App; use Illuminate\Support\ServiceProvider; -use Pingpong\Menus\MenusServiceProvider; -use Pingpong\Modules\ModulesServiceProvider; class AppServiceProvider extends ServiceProvider { @@ -63,14 +62,11 @@ class AppServiceProvider extends ServiceProvider $this->app->register(DebugBarServiceProvider::class); } - // register PingPong module extension - $this->app->register(ModulesServiceProvider::class); - $this->app->register(MenusServiceProvider::class); $this->app->register(LaravelLocalizationServiceProvider::class); // create singletons for registering widgets $this->app->singleton('registerWidget', function ($app) { - return new WidgetRegistrator($app); + return new WidgetRegistrator(); }); // create singleton for display pipeline - pipeline used for displaying visitor pages @@ -85,7 +81,7 @@ class AppServiceProvider extends ServiceProvider // create registrator for template directories $this->app->singleton('registerTemplateDir', function ($app) { - return new TemplateRegistrator($app); + return new TemplateRegistrator(); }); $this->app->singleton('registerSettingsExtension', function ($app) { @@ -110,6 +106,7 @@ class AppServiceProvider extends ServiceProvider // register all available widgets $registrator->register(HtmlCode::class); $registrator->register(Menu::class); + $registrator->register(SocialButtons::class); } /** @@ -122,6 +119,7 @@ class AppServiceProvider extends ServiceProvider $registrator->register('basic', 'admin/settings.basic', 'admin.settings.parts.basic'); $registrator->register('meta', 'admin/settings.meta', 'admin.settings.parts.meta'); $registrator->register('social', 'admin/settings.socialSites', 'admin.settings.parts.social'); + $registrator->register('advanced', 'admin/settings.advanced.title', 'admin.settings.parts.advanced', 999); } /** @@ -140,7 +138,7 @@ class AppServiceProvider extends ServiceProvider $registrator = $this->app->make('displayPipeline'); $registrator->add(AddViewedToPage::class); - $registrator->add(CompileShortcodes::class); +// $registrator->add(CompileShortcodes::class); } private function registerSavePipeline() diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 57d88ea3..08e6ed49 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -2,30 +2,58 @@ namespace App\Providers; -use Illuminate\Contracts\Auth\Access\Gate as GateContract; -use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; +use App\Models\ActionLog\ActionLog; +use App\Models\Content\Content; +use App\Models\FileManager\Directory; +use App\Models\FileManager\File; +use App\Models\Module; +use App\Models\Settings; +use App\Models\Templates\Template; +use App\Models\User; +use App\Models\Widgets\Widget; +use App\Models\Widgets\WidgetArea; +use App\Policies\ActionLogPolicy; +use App\Policies\ContentPolicy; +use App\Policies\DirectoriesPolicy; +use App\Policies\FilesPolicy; +use App\Policies\ModulePolicy; +use App\Policies\SettingsPolicy; +use App\Policies\TemplatePolicy; +use App\Policies\UserPolicy; +use App\Policies\WidgetAreaPolicy; +use App\Policies\WidgetsPolicy; +use Illuminate\Foundation\Support\Providers\AuthServiceProvider as IlluminateAuthServiceProvider; -class AuthServiceProvider extends ServiceProvider +class AuthServiceProvider extends IlluminateAuthServiceProvider { /** * The policy mappings for the application. - * * @var array */ protected $policies = [ - 'App\Model' => 'App\Policies\ModelPolicy', + Content::class => ContentPolicy::class, + User::class => UserPolicy::class, + Module::class => ModulePolicy::class, + File::class => FilesPolicy::class, + ActionLog::class => ActionLogPolicy::class, + Template::class => TemplatePolicy::class, + Directory::class => DirectoriesPolicy::class, + Settings::class => SettingsPolicy::class, + Widget::class => WidgetsPolicy::class, + WidgetArea::class => WidgetAreaPolicy::class, + ActionLog::class => ActionLogPolicy::class, ]; /** * Register any application authentication / authorization services. * - * @param \Illuminate\Contracts\Auth\Access\Gate $gate + * @param \Illuminate\Contracts\Auth\Access\Gate $gate + * * @return void */ - public function boot(GateContract $gate) + public function boot() { - $this->registerPolicies($gate); - + $this->registerPolicies(); // } } diff --git a/app/Providers/BladeExtender.php b/app/Providers/BladeExtender.php index 3475ea2d..fea57a1f 100644 --- a/app/Providers/BladeExtender.php +++ b/app/Providers/BladeExtender.php @@ -26,7 +26,7 @@ class BladeExtender extends ServiceProvider $this->extendBlade(); - Shortcode::register('widget', Widget::class); +// Shortcode::register('widget', Widget::class); } /** diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 47403ba2..da038506 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -43,21 +43,21 @@ use App\Listeners\Loggers\LogPublishContent; use App\Listeners\Loggers\LogRemoveWidgetFromArea; use App\Listeners\Loggers\LogSetHomepage; use App\Listeners\Loggers\LogUploadFile; +use App\Listeners\SetDefaultPermissions; use Illuminate\Auth\Events\Login; use Illuminate\Auth\Events\Logout; -use Illuminate\Contracts\Events\Dispatcher as DispatcherContract; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. - * * @var array */ protected $listen = [ CreateNewUser::class => [ LogCreatedUser::class, + SetDefaultPermissions::class, ], EditUser::class => [ LogEditUser::class, diff --git a/app/Providers/LaravelLocalizationServiceProvider.php b/app/Providers/LaravelLocalizationServiceProvider.php index 00b3db64..491d5861 100644 --- a/app/Providers/LaravelLocalizationServiceProvider.php +++ b/app/Providers/LaravelLocalizationServiceProvider.php @@ -1,5 +1,6 @@ get(); + try { + $languages = DB::table('languages') + ->get(); + } catch (QueryException $e) { + $supportedLocales[config('app.locale')] = [ + 'native' => env('LOCALE_NATIVE_NAME', config('app.locale')), + 'script' => env('LOCALE_SCRIPT', 'Latn'), + 'name' => env('LOCALE_TRANSLATED_NAME', config('app.locale')), + 'code' => config('app.locale'), + ]; + $this->setSupportedLocales($supportedLocales); + return; + } $supportedLocales = []; if (empty($languages)) { @@ -32,15 +44,20 @@ class LaravelLocalizationServiceProvider extends ServiceProvider ]; } - config([ - 'laravellocalization.supportedLocales' => $supportedLocales, - 'laravellocalization.useAcceptLanguageHeader' => true, - 'laravellocalization.hideDefaultLocaleInURL' => true - ]); + $this->setSupportedLocales($supportedLocales); } public function boot() { \App::setLocale(LaravelLocalization::getCurrentLocale()); } + + private function setSupportedLocales($supportedLocales) + { + config([ + 'laravellocalization.supportedLocales' => $supportedLocales, + 'laravellocalization.useAcceptLanguageHeader' => true, + 'laravellocalization.hideDefaultLocaleInURL' => true + ]); + } } \ No newline at end of file diff --git a/app/Providers/ModuleManager.php b/app/Providers/ModuleManager.php deleted file mode 100644 index 5594544f..00000000 --- a/app/Providers/ModuleManager.php +++ /dev/null @@ -1,93 +0,0 @@ -get(); - - foreach ($modules as $module) { - $module->module_settings = json_decode($module->module_settings); - } - - return $modules; - }); - - // iterate over all modules and enable or disable them - foreach ($modules as $module) { - if ($module->is_template) { - if (isset($module->module_settings->providers) && !empty($module->module_settings->providers)) { - foreach ($module->module_settings->providers as $provider) { - $this->app->register($provider); - } - } - - continue; - } - - $this->createModulesJson($module); - } - } - - /** - * Register the application services. - * @return void - */ - public function register() - { - } - - /** - * Read config file and merge it with module config in database. - * This method REQUIRES published config of given module (otherwise config(modulename) is not available)! - * - * @param Module $module - * - * @throws \ErrorException when module.json is not writable - */ - private function createModulesJson(Module $module) - { - $config = $module->module_settings; - - if (is_null($config)) { - return; - } - - // path to module.json - $path = config('modules.paths.modules') . DIRECTORY_SEPARATOR . $config->staticName . DIRECTORY_SEPARATOR . 'module.json'; - - // check if module config is writable - if (!is_writable(dirname($path))) { - Log::warning('Cannot write to ' . $path); - return; - } - - // set enabled/disabled status for this module - $data = new \stdClass(); - $data->name = $config->staticName; - $data->description = $module->description; - $data->alias = $module->alias; - $data->providers = $config->providers; - $data->aliases = $config->aliases; - $data->order = $config->order; - $data->files = $config->files; - $data->active = $module->enabled; - - // create file - file_put_contents($path, json_encode($data)); - } -} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index d50b1c0f..c18b2785 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -2,43 +2,52 @@ namespace App\Providers; -use Illuminate\Routing\Router; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; +use Illuminate\Support\Facades\Route; class RouteServiceProvider extends ServiceProvider { /** - * This namespace is applied to the controller routes in your routes file. - * + * This namespace is applied to your controller routes. * In addition, it is set as the URL generator's root namespace. - * * @var string */ protected $namespace = 'App\Http\Controllers'; /** - * Define your route model bindings, pattern filters, etc. - * - * @param \Illuminate\Routing\Router $router + * Define the routes for the application. * @return void */ - public function boot(Router $router) + public function map() { - // - - parent::boot($router); + $this->mapAdminRoutes(); + $this->mapWebRoutes(); } /** - * Define the routes for the application. - * - * @param \Illuminate\Routing\Router $router + * Define the "admin" routes for the application. + * These routes all receive session state, CSRF protection, etc. * @return void */ - public function map(Router $router) + protected function mapAdminRoutes() { - $router->group(['namespace' => $this->namespace], function ($router) { - require app_path('Http/routes.php'); - }); + // separate route file for Auth::routes() + Route::namespace($this->namespace) + ->group(base_path('routes/auth.php')); + + // routes for administration + Route::namespace($this->namespace . '\\Admin') + ->group(base_path('routes/admin.php')); } -} + + /** + * Define the "web" routes for the application. + * These routes all receive session state, CSRF protection, etc. + * @return void + */ + protected function mapWebRoutes() + { + Route::namespace($this->namespace) + ->group(base_path('routes/web.php')); + } +} \ No newline at end of file diff --git a/app/Providers/SubmodulesManager.php b/app/Providers/SubmodulesManager.php deleted file mode 100644 index ee8bbe77..00000000 --- a/app/Providers/SubmodulesManager.php +++ /dev/null @@ -1,64 +0,0 @@ -getPath(); - $config = new Json($modulePath . DIRECTORY_SEPARATOR . 'module.json'); - - // Does this module specify any providers? If not, consider this module with submodules and register them - if ($config->get('providers')) { - continue; - } - - $submodules = \File::directories($modulePath); - - foreach ($submodules as $submodulePath) { - try { - $config = new Json($submodulePath . DIRECTORY_SEPARATOR . 'module.json'); - - if (!$config->get('active')) { - continue; - } - - $serviceProviders = $config->get('providers', []); - foreach ($serviceProviders as $serviceProvider) { - $this->app->register($serviceProvider); - } - - $initFiles = $config->get('files', []); - - foreach ($initFiles as $file) { - require $submodulePath . DIRECTORY_SEPARATOR . $file; - } - } catch (FileNotFoundException $e) { - // ignore missing module and do not register this submodule - } - } - } - } - - /** - * Register the service provider. - * - * @return void - */ - public function register() - { - } -} \ No newline at end of file diff --git a/app/Providers/TemplateServiceProvider.php b/app/Providers/TemplateServiceProvider.php index 6c30bf40..606ec283 100644 --- a/app/Providers/TemplateServiceProvider.php +++ b/app/Providers/TemplateServiceProvider.php @@ -5,7 +5,8 @@ namespace App\Providers; use App\CMS\Contracts\Repositories\Template as TemplateContract; use App\CMS\Handlers\Registrators\TemplateRegistrator; use App\CMS\Helpers\CurrentTemplate; -use App\Models\Module; +use App\CMS\Repositories\Module; +use Illuminate\Database\QueryException; use Illuminate\Support\Facades\App; use Illuminate\Support\ServiceProvider; @@ -13,25 +14,20 @@ class TemplateServiceProvider extends ServiceProvider { public function boot() { + try { + $template = CurrentTemplate::get(); + } catch (QueryException $e) { + return; + } + // ignore running from artisan - if (App::runningInConsole() || App::environment('testing')) { + if (App::runningInConsole() || App::environment('testing') || !$template) { $this->publishViewResources(); return; } - $template = CurrentTemplate::get(); - - if (!$template) { - throw new \ErrorException('Template is not set, cannot continue'); - } - - // include files - $files = isset($template->moduleSettings->files) ? $template->moduleSettings->files : []; - - foreach ($files as $file) { - include_once $file; - } + // service providers and files already registered in ModuleManager // register templates $publicTemplates = CurrentTemplate::getPublicTemplatePaths(); @@ -43,12 +39,17 @@ class TemplateServiceProvider extends ServiceProvider $this->registerTemplatePaths($publicTemplates); } + /** + * Register template paths from public templates + * + * @param $publicTemplates + */ public function registerTemplatePaths($publicTemplates) { - $modules = Module::where('enabled', true) - ->get() - ->pluck('id', 'alias') - ->toArray(); + $modules = app(Module::class) + ->all() + ->pluck('id', 'alias') + ->toArray(); /** * @var $registrator TemplateRegistrator @@ -77,7 +78,6 @@ class TemplateServiceProvider extends ServiceProvider /** * Register the service provider. - * * @return void */ public function register() @@ -94,7 +94,7 @@ class TemplateServiceProvider extends ServiceProvider return; } - $templateDir = base_path('templates/' . $template->module_settings->staticName . '/Resources'); + $templateDir = base_path('templates/' . $template->static_name . '/Resources'); $assetsDir = $templateDir . '/' . TemplateContract::ASSETS_DIRECTORY; $viewsDir = $templateDir . '/views'; diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php index 38301379..a30639dc 100644 --- a/bootstrap/autoload.php +++ b/bootstrap/autoload.php @@ -14,21 +14,5 @@ define('LARAVEL_START', microtime(true)); | */ +require_once __DIR__ . '/../app/CMS/Helpers/functions.php'; require __DIR__.'/../vendor/autoload.php'; - -/* -|-------------------------------------------------------------------------- -| Include The Compiled Class File -|-------------------------------------------------------------------------- -| -| To dramatically increase your application's performance, you may use a -| compiled class file which contains all of the classes commonly used -| by a request. The Artisan "optimize" is used to create this file. -| -*/ - -$compiledPath = __DIR__.'/cache/compiled.php'; - -if (file_exists($compiledPath)) { - require $compiledPath; -} diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore old mode 100755 new mode 100644 diff --git a/bower.json b/bower.json index 313afb2b..da75cfaf 100644 --- a/bower.json +++ b/bower.json @@ -4,14 +4,14 @@ "devDependencies": {}, "dependencies": { "animate.css": "~3.4.0", - "bootstrap": "v4.0.0-alpha.3", + "bootstrap": "v4.0.0-alpha.5", "font-awesome": "~4.5.0", - "jquery": "~2.1.4", + "jquery": "~3.2.1", "metisMenu": "~2.0.3", "nprogress": "~0.2.0", "responsive-bootstrap-toolkit": "~2.5.0", "Sortable": "~1.4.2", - "tether": "~1.1.1", + "tether": "~1.3.7", "tinycolor": "~1.2.1", "dropzone": "~4.2.0", "jquery.are-you-sure": "~1.9", diff --git a/composer.json b/composer.json index 67731974..ab91ed62 100644 --- a/composer.json +++ b/composer.json @@ -7,15 +7,16 @@ "license": "MIT", "type": "project", "require": { - "php": ">=5.5.9", - "laravel/framework": "5.2.*", - "pingpong/modules": "~2.0", - "pingpong/menus": "^2.2", + "php": ">=7.0.0", + "laravel/framework": "5.5.*", "watson/sitemap": "^2.0", "mcamara/laravel-localization": "^1.1", - "franzose/closure-table": "^4.1", + "franzose/closure-table": "5.*", "intervention/image": "^2.3", - "webwizo/laravel-shortcodes": "1.0.4" + "webwizo/laravel-shortcodes": "1.*", + "greggilbert/recaptcha": "^2.2@dev", + "doctrine/dbal": "^2.7@dev", + "nwidart/laravel-menus": "dev-master" }, "require-dev": { "fzaninotto/faker": "~1.4", @@ -23,7 +24,6 @@ "phpunit/phpunit": "~4.0", "symfony/css-selector": "2.8.*|3.0.*", "symfony/dom-crawler": "2.8.*|3.0.*", - "ignasbernotas/laravel-model-generator": "^1.0", "barryvdh/laravel-debugbar": "^2.1" }, "autoload": { @@ -38,16 +38,9 @@ } }, "scripts": { - "post-install-cmd": [ - "php artisan clear-compiled", - "php artisan optimize" - ], - "pre-update-cmd": [ - "php artisan clear-compiled" - ], - "post-update-cmd": [ - "php artisan optimize" - ] + "post-install-cmd": [], + "pre-update-cmd": [], + "post-update-cmd": [] }, "config": { "preferred-install": "dist", diff --git a/composer.lock b/composer.lock index 72379f2f..5df7945e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,127 +4,39 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "1d486fb23e76c7af1daf00bee207919c", - "content-hash": "957b49e5a2e691ad8dbc0e665a87d6c7", + "content-hash": "1d30e667fae6843a172f62a333c2b60c", "packages": [ - { - "name": "classpreloader/classpreloader", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/ClassPreloader/ClassPreloader.git", - "reference": "de1d55df4f492374f0b77eb06da990b7393a433f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ClassPreloader/ClassPreloader/zipball/de1d55df4f492374f0b77eb06da990b7393a433f", - "reference": "de1d55df4f492374f0b77eb06da990b7393a433f", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^1.0|^2.0", - "php": ">=5.5.9" - }, - "require-dev": { - "phpunit/phpunit": "^4.8|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "ClassPreloader\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com" - }, - { - "name": "Graham Campbell", - "email": "graham@alt-three.com" - } - ], - "description": "Helps class loading performance by generating a single PHP file containing all of the autoloaded files for a specific use case", - "keywords": [ - "autoload", - "class", - "preload" - ], - "time": "2016-01-24 12:28:38" - }, - { - "name": "dnoegel/php-xdg-base-dir", - "version": "0.1", - "source": { - "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/265b8593498b997dc2d31e75b89f053b5cc9621a", - "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "@stable" - }, - "type": "project", - "autoload": { - "psr-4": { - "XdgBaseDir\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "implementation of xdg base directory specification for php", - "time": "2014-10-24 07:27:01" - }, { "name": "doctrine/annotations", "version": "dev-master", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "f9cf50745a45cae4a55f35e7691d124c4d887e45" + "reference": "2497b1f9db56278d3ad2248f9e4bdbbbaa271c3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/f9cf50745a45cae4a55f35e7691d124c4d887e45", - "reference": "f9cf50745a45cae4a55f35e7691d124c4d887e45", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/2497b1f9db56278d3ad2248f9e4bdbbbaa271c3e", + "reference": "2497b1f9db56278d3ad2248f9e4bdbbbaa271c3e", "shasum": "" }, "require": { "doctrine/lexer": "1.*", - "php": ">=5.3.2" + "php": "^7.1" }, "require-dev": { "doctrine/cache": "1.*", - "phpunit/phpunit": "4.*" + "phpunit/phpunit": "^5.7" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "1.6.x-dev" } }, "autoload": { - "psr-0": { - "Doctrine\\Common\\Annotations\\": "lib/" + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" } }, "notification-url": "https://packagist.org/downloads/", @@ -160,7 +72,7 @@ "docblock", "parser" ], - "time": "2016-08-31 09:31:57" + "time": "2017-07-22T11:08:38+00:00" }, { "name": "doctrine/cache", @@ -168,28 +80,35 @@ "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "fe68e4f78804684e31cce17590b0bd9f088db1b0" + "reference": "beb0fa35b61e9073f8612d9ffd34920bdaec406a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/fe68e4f78804684e31cce17590b0bd9f088db1b0", - "reference": "fe68e4f78804684e31cce17590b0bd9f088db1b0", + "url": "https://api.github.com/repos/doctrine/cache/zipball/beb0fa35b61e9073f8612d9ffd34920bdaec406a", + "reference": "beb0fa35b61e9073f8612d9ffd34920bdaec406a", "shasum": "" }, "require": { - "php": "~5.5|~7.0" + "php": "~7.1" }, "conflict": { "doctrine/common": ">2.2,<2.4" }, "require-dev": { - "phpunit/phpunit": "~4.8|~5.0", - "predis/predis": "~1.0" + "alcaeus/mongo-php-adapter": "^1.1", + "doctrine/coding-standard": "^1.0", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^6.3", + "predis/predis": "~1.0", + "squizlabs/php_codesniffer": "^3.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7.x-dev" + "dev-master": "1.8.x-dev" } }, "autoload": { @@ -229,7 +148,7 @@ "cache", "caching" ], - "time": "2016-07-15 15:57:08" + "time": "2017-08-25T06:51:37+00:00" }, { "name": "doctrine/collections", @@ -237,29 +156,31 @@ "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "2dfc898f2a66c192d6a195bdc9c5040f65adfaab" + "reference": "42c4039eca9535e4f201f50d2695648658e9e5a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/2dfc898f2a66c192d6a195bdc9c5040f65adfaab", - "reference": "2dfc898f2a66c192d6a195bdc9c5040f65adfaab", + "url": "https://api.github.com/repos/doctrine/collections/zipball/42c4039eca9535e4f201f50d2695648658e9e5a8", + "reference": "42c4039eca9535e4f201f50d2695648658e9e5a8", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "doctrine/coding-standard": "^1.0", + "phpunit/phpunit": "^6.3", + "squizlabs/php_codesniffer": "^3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "1.6.x-dev" } }, "autoload": { - "psr-0": { - "Doctrine\\Common\\Collections\\": "lib/" + "psr-4": { + "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" } }, "notification-url": "https://packagist.org/downloads/", @@ -295,7 +216,7 @@ "collections", "iterator" ], - "time": "2016-09-01 10:39:08" + "time": "2017-08-30T09:16:50+00:00" }, { "name": "doctrine/common", @@ -303,12 +224,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "670d814b6c8b5e8f39a2764d090463d39b3502c9" + "reference": "a3e240fa07ec9748387c13534949d543c0e177fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/670d814b6c8b5e8f39a2764d090463d39b3502c9", - "reference": "670d814b6c8b5e8f39a2764d090463d39b3502c9", + "url": "https://api.github.com/repos/doctrine/common/zipball/a3e240fa07ec9748387c13534949d543c0e177fa", + "reference": "a3e240fa07ec9748387c13534949d543c0e177fa", "shasum": "" }, "require": { @@ -317,15 +238,17 @@ "doctrine/collections": "1.*", "doctrine/inflector": "1.*", "doctrine/lexer": "1.*", - "php": "~5.6|~7.0" + "php": "~7.1" }, "require-dev": { - "phpunit/phpunit": "^5.4.6" + "doctrine/coding-standard": "^1.0", + "phpunit/phpunit": "^6.3", + "squizlabs/php_codesniffer": "^3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7.x-dev" + "dev-master": "2.9.x-dev" } }, "autoload": { @@ -357,6 +280,10 @@ { "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" } ], "description": "Common Library for Doctrine projects", @@ -368,7 +295,7 @@ "persistence", "spl" ], - "time": "2016-07-20 15:39:51" + "time": "2017-09-02T17:51:46+00:00" }, { "name": "doctrine/dbal", @@ -376,21 +303,24 @@ "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "c446c31130e6db7178e4188f8c12033b2ca3ee4a" + "reference": "373ae9ed860960cf4e3a061ff27db254de955fb9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/c446c31130e6db7178e4188f8c12033b2ca3ee4a", - "reference": "c446c31130e6db7178e4188f8c12033b2ca3ee4a", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/373ae9ed860960cf4e3a061ff27db254de955fb9", + "reference": "373ae9ed860960cf4e3a061ff27db254de955fb9", "shasum": "" }, "require": { - "doctrine/common": "~2.4", - "php": "^5.6 || ^7.0" + "doctrine/common": "^2.7.1", + "ext-pdo": "*", + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^5.4.6", + "doctrine/coding-standard": "^1.0", + "phpunit/phpunit": "^6.3", "phpunit/phpunit-mock-objects": "!=3.2.4,!=3.2.5", + "squizlabs/php_codesniffer": "^3.0", "symfony/console": "2.*||^3.0" }, "suggest": { @@ -402,7 +332,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6.x-dev" + "dev-master": "2.7.x-dev" } }, "autoload": { @@ -440,7 +370,7 @@ "persistence", "queryobject" ], - "time": "2016-08-25 23:11:10" + "time": "2017-09-12T09:50:27+00:00" }, { "name": "doctrine/inflector", @@ -448,29 +378,29 @@ "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "803a2ed9fea02f9ca47cd45395089fe78769a392" + "reference": "03d4145619c2762948e4a8c53a899af24a1e4f73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/803a2ed9fea02f9ca47cd45395089fe78769a392", - "reference": "803a2ed9fea02f9ca47cd45395089fe78769a392", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/03d4145619c2762948e4a8c53a899af24a1e4f73", + "reference": "03d4145619c2762948e4a8c53a899af24a1e4f73", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "4.*" + "phpunit/phpunit": "^6.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { - "psr-0": { - "Doctrine\\Common\\Inflector\\": "lib/" + "psr-4": { + "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" } }, "notification-url": "https://packagist.org/downloads/", @@ -507,7 +437,7 @@ "singularize", "string" ], - "time": "2016-05-12 17:23:41" + "time": "2017-08-25T04:43:19+00:00" }, { "name": "doctrine/lexer", @@ -515,12 +445,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" + "reference": "cc709ba91eee09540091ad5a5f2616727662e41b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", - "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/cc709ba91eee09540091ad5a5f2616727662e41b", + "reference": "cc709ba91eee09540091ad5a5f2616727662e41b", "shasum": "" }, "require": { @@ -533,8 +463,8 @@ } }, "autoload": { - "psr-0": { - "Doctrine\\Common\\Lexer\\": "lib/" + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" } }, "notification-url": "https://packagist.org/downloads/", @@ -561,22 +491,82 @@ "lexer", "parser" ], - "time": "2014-09-09 13:34:57" + "time": "2017-07-24T09:37:08+00:00" }, { - "name": "erusev/parsedown", - "version": "1.6.0", + "name": "egulias/email-validator", + "version": "2.1.2", "source": { "type": "git", - "url": "https://github.com/erusev/parsedown.git", - "reference": "3ebbd730b5c2cf5ce78bc1bf64071407fc6674b7" + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "bc31baa11ea2883e017f0a10d9722ef9d50eac1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/erusev/parsedown/zipball/3ebbd730b5c2cf5ce78bc1bf64071407fc6674b7", - "reference": "3ebbd730b5c2cf5ce78bc1bf64071407fc6674b7", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/bc31baa11ea2883e017f0a10d9722ef9d50eac1c", + "reference": "bc31baa11ea2883e017f0a10d9722ef9d50eac1c", "shasum": "" }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">= 5.5" + }, + "require-dev": { + "dominicsayers/isemail": "dev-master", + "phpunit/phpunit": "^4.8.0", + "satooshi/php-coveralls": "dev-master" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "EmailValidator" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "time": "2017-01-30T22:07:36+00:00" + }, + { + "name": "erusev/parsedown", + "version": "1.6.3", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown.git", + "reference": "728952b90a333b5c6f77f06ea9422b94b585878d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/728952b90a333b5c6f77f06ea9422b94b585878d", + "reference": "728952b90a333b5c6f77f06ea9422b94b585878d", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, "type": "library", "autoload": { "psr-0": { @@ -600,64 +590,20 @@ "markdown", "parser" ], - "time": "2015-10-04 16:44:32" - }, - { - "name": "erusev/parsedown-extra", - "version": "0.7.1", - "source": { - "type": "git", - "url": "https://github.com/erusev/parsedown-extra.git", - "reference": "0db5cce7354e4b76f155d092ab5eb3981c21258c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/erusev/parsedown-extra/zipball/0db5cce7354e4b76f155d092ab5eb3981c21258c", - "reference": "0db5cce7354e4b76f155d092ab5eb3981c21258c", - "shasum": "" - }, - "require": { - "erusev/parsedown": "~1.4" - }, - "type": "library", - "autoload": { - "psr-0": { - "ParsedownExtra": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Emanuil Rusev", - "email": "hello@erusev.com", - "homepage": "http://erusev.com" - } - ], - "description": "An extension of Parsedown that adds support for Markdown Extra.", - "homepage": "https://github.com/erusev/parsedown-extra", - "keywords": [ - "markdown", - "markdown extra", - "parsedown", - "parser" - ], - "time": "2015-11-01 10:19:22" + "time": "2017-05-14T14:47:48+00:00" }, { "name": "franzose/closure-table", - "version": "4.1.4", + "version": "v5.1", "source": { "type": "git", "url": "https://github.com/franzose/ClosureTable.git", - "reference": "8198a43f2237da35a2b9298d286a073650e95568" + "reference": "0056fdb54256bf23b10ac10139b4a892ad478385" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/franzose/ClosureTable/zipball/8198a43f2237da35a2b9298d286a073650e95568", - "reference": "8198a43f2237da35a2b9298d286a073650e95568", + "url": "https://api.github.com/repos/franzose/ClosureTable/zipball/0056fdb54256bf23b10ac10139b4a892ad478385", + "reference": "0056fdb54256bf23b10ac10139b4a892ad478385", "shasum": "" }, "require": { @@ -702,7 +648,59 @@ "laravel", "pages" ], - "time": "2016-07-08 08:19:46" + "time": "2017-09-10T23:00:47+00:00" + }, + { + "name": "greggilbert/recaptcha", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/greggilbert/recaptcha.git", + "reference": "c2ed383785a4fe20467ce470c97c303e5c5b85de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/greggilbert/recaptcha/zipball/c2ed383785a4fe20467ce470c97c303e5c5b85de", + "reference": "c2ed383785a4fe20467ce470c97c303e5c5b85de", + "shasum": "" + }, + "require": { + "illuminate/support": "~5.1", + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/migrations" + ], + "psr-4": { + "Greggilbert\\Recaptcha\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Greg Gilbert", + "email": "greg@greg-gilbert.com" + } + ], + "description": "reCAPTCHA Validator for Laravel 5", + "homepage": "http://github.com/greggilbert/recaptcha", + "keywords": [ + "captcha", + "laravel", + "laravel5", + "recaptcha" + ], + "time": "2017-08-31T03:39:47+00:00" }, { "name": "guzzlehttp/psr7", @@ -710,12 +708,12 @@ "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "64862e854f876bc5aee2996cab2f552db8586065" + "reference": "811b676fbab9c99e359885032e5ebc70e442f5b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/64862e854f876bc5aee2996cab2f552db8586065", - "reference": "64862e854f876bc5aee2996cab2f552db8586065", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/811b676fbab9c99e359885032e5ebc70e442f5b8", + "reference": "811b676fbab9c99e359885032e5ebc70e442f5b8", "shasum": "" }, "require": { @@ -767,20 +765,20 @@ "uri", "url" ], - "time": "2016-08-03 09:33:34" + "time": "2017-07-17T09:11:21+00:00" }, { "name": "intervention/image", - "version": "dev-master", + "version": "2.4.0", "source": { "type": "git", "url": "https://github.com/Intervention/image.git", - "reference": "4064a980324f6c3bfa2bd981dfb247afa705ec3c" + "reference": "322a4ade249467179c50a3e50eda8760ff3af2a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Intervention/image/zipball/4064a980324f6c3bfa2bd981dfb247afa705ec3c", - "reference": "4064a980324f6c3bfa2bd981dfb247afa705ec3c", + "url": "https://api.github.com/repos/Intervention/image/zipball/322a4ade249467179c50a3e50eda8760ff3af2a3", + "reference": "322a4ade249467179c50a3e50eda8760ff3af2a3", "shasum": "" }, "require": { @@ -790,7 +788,7 @@ }, "require-dev": { "mockery/mockery": "~0.9.2", - "phpunit/phpunit": "3.*" + "phpunit/phpunit": "^4.8 || ^5.7" }, "suggest": { "ext-gd": "to use GD library based image processing.", @@ -801,6 +799,14 @@ "extra": { "branch-alias": { "dev-master": "2.3-dev" + }, + "laravel": { + "providers": [ + "Intervention\\Image\\ImageServiceProvider" + ], + "aliases": { + "Image": "Intervention\\Image\\Facades\\Image" + } } }, "autoload": { @@ -815,8 +821,8 @@ "authors": [ { "name": "Oliver Vogel", - "email": "oliver@olivervogel.net", - "homepage": "http://olivervogel.net/" + "email": "oliver@olivervogel.com", + "homepage": "http://olivervogel.com/" } ], "description": "Image handling and manipulation library with support for Laravel integration", @@ -829,191 +835,45 @@ "thumbnail", "watermark" ], - "time": "2016-09-01 17:04:03" - }, - { - "name": "jakub-onderka/php-console-color", - "version": "0.1", - "source": { - "type": "git", - "url": "https://github.com/JakubOnderka/PHP-Console-Color.git", - "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/e0b393dacf7703fc36a4efc3df1435485197e6c1", - "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "jakub-onderka/php-code-style": "1.0", - "jakub-onderka/php-parallel-lint": "0.*", - "jakub-onderka/php-var-dump-check": "0.*", - "phpunit/phpunit": "3.7.*", - "squizlabs/php_codesniffer": "1.*" - }, - "type": "library", - "autoload": { - "psr-0": { - "JakubOnderka\\PhpConsoleColor": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Jakub Onderka", - "email": "jakub.onderka@gmail.com", - "homepage": "http://www.acci.cz" - } - ], - "time": "2014-04-08 15:00:19" - }, - { - "name": "jakub-onderka/php-console-highlighter", - "version": "v0.3.2", - "source": { - "type": "git", - "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git", - "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/7daa75df45242c8d5b75a22c00a201e7954e4fb5", - "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5", - "shasum": "" - }, - "require": { - "jakub-onderka/php-console-color": "~0.1", - "php": ">=5.3.0" - }, - "require-dev": { - "jakub-onderka/php-code-style": "~1.0", - "jakub-onderka/php-parallel-lint": "~0.5", - "jakub-onderka/php-var-dump-check": "~0.1", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~1.5" - }, - "type": "library", - "autoload": { - "psr-0": { - "JakubOnderka\\PhpConsoleHighlighter": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jakub Onderka", - "email": "acci@acci.cz", - "homepage": "http://www.acci.cz/" - } - ], - "time": "2015-04-20 18:58:01" - }, - { - "name": "jeremeamia/SuperClosure", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/jeremeamia/super_closure.git", - "reference": "6fe8ad066d3b2b01ad71d2130ebd38ccaabd549f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jeremeamia/super_closure/zipball/6fe8ad066d3b2b01ad71d2130ebd38ccaabd549f", - "reference": "6fe8ad066d3b2b01ad71d2130ebd38ccaabd549f", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^1.2|^2.0", - "php": ">=5.4", - "symfony/polyfill-php56": "^1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - } - }, - "autoload": { - "psr-4": { - "SuperClosure\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jeremy Lindblom", - "email": "jeremeamia@gmail.com", - "homepage": "https://github.com/jeremeamia", - "role": "Developer" - } - ], - "description": "Serialize Closure objects, including their context and binding", - "homepage": "https://github.com/jeremeamia/super_closure", - "keywords": [ - "closure", - "function", - "lambda", - "parser", - "serializable", - "serialize", - "tokenizer" - ], - "time": "2016-02-29 04:36:50" + "time": "2017-07-03T15:50:40+00:00" }, { "name": "laravel/framework", - "version": "5.2.x-dev", + "version": "5.5.x-dev", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "557b9f62005639cfe6a20c26c3e7c9dc8a7a637a" + "reference": "d12f1edfd30aa4279a32b64fc67598d927ca97f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/557b9f62005639cfe6a20c26c3e7c9dc8a7a637a", - "reference": "557b9f62005639cfe6a20c26c3e7c9dc8a7a637a", + "url": "https://api.github.com/repos/laravel/framework/zipball/d12f1edfd30aa4279a32b64fc67598d927ca97f3", + "reference": "d12f1edfd30aa4279a32b64fc67598d927ca97f3", "shasum": "" }, "require": { - "classpreloader/classpreloader": "~3.0", - "doctrine/inflector": "~1.0", + "doctrine/inflector": "~1.1", + "erusev/parsedown": "~1.6", "ext-mbstring": "*", "ext-openssl": "*", - "jeremeamia/superclosure": "~2.2", "league/flysystem": "~1.0", - "monolog/monolog": "~1.11", + "monolog/monolog": "~1.12", "mtdowling/cron-expression": "~1.0", "nesbot/carbon": "~1.20", - "paragonie/random_compat": "~1.4", - "php": ">=5.5.9", - "psy/psysh": "0.7.*", - "swiftmailer/swiftmailer": "~5.1", - "symfony/console": "2.8.*|3.0.*", - "symfony/debug": "2.8.*|3.0.*", - "symfony/finder": "2.8.*|3.0.*", - "symfony/http-foundation": "2.8.*|3.0.*", - "symfony/http-kernel": "2.8.*|3.0.*", - "symfony/polyfill-php56": "~1.0", - "symfony/process": "2.8.*|3.0.*", - "symfony/routing": "2.8.*|3.0.*", - "symfony/translation": "2.8.*|3.0.*", - "symfony/var-dumper": "2.8.*|3.0.*", + "php": ">=7.0", + "psr/container": "~1.0", + "psr/simple-cache": "^1.0", + "ramsey/uuid": "~3.0", + "swiftmailer/swiftmailer": "~6.0", + "symfony/console": "~3.3", + "symfony/debug": "~3.3", + "symfony/finder": "~3.3", + "symfony/http-foundation": "~3.3", + "symfony/http-kernel": "~3.3", + "symfony/process": "~3.3", + "symfony/routing": "~3.3", + "symfony/var-dumper": "~3.3", + "tijsverkoyen/css-to-inline-styles": "~2.2", "vlucas/phpdotenv": "~2.2" }, "replace": { @@ -1035,6 +895,7 @@ "illuminate/http": "self.version", "illuminate/log": "self.version", "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", "illuminate/pagination": "self.version", "illuminate/pipeline": "self.version", "illuminate/queue": "self.version", @@ -1049,37 +910,39 @@ }, "require-dev": { "aws/aws-sdk-php": "~3.0", - "mockery/mockery": "~0.9.4", + "doctrine/dbal": "~2.5", + "filp/whoops": "^2.1.4", + "mockery/mockery": "~1.0", + "orchestra/testbench-core": "3.5.*", "pda/pheanstalk": "~3.0", - "phpunit/phpunit": "~4.1", - "predis/predis": "~1.0", - "symfony/css-selector": "2.8.*|3.0.*", - "symfony/dom-crawler": "2.8.*|3.0.*" + "phpunit/phpunit": "~6.0", + "predis/predis": "^1.1.1", + "symfony/css-selector": "~3.3", + "symfony/dom-crawler": "~3.3" }, "suggest": { "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", - "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.4).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.5).", "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", - "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~5.3|~6.0).", + "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~6.0).", + "laravel/tinker": "Required to use the tinker console command (~1.0).", "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", + "nexmo/client": "Required to use the Nexmo transport (~1.0).", "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~2.0).", - "symfony/css-selector": "Required to use some of the crawler integration testing tools (2.8.*|3.0.*).", - "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (2.8.*|3.0.*).", - "symfony/psr-http-message-bridge": "Required to use psr7 bridging features (0.2.*)." + "symfony/css-selector": "Required to use some of the crawler integration testing tools (~3.3).", + "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~3.3).", + "symfony/psr-http-message-bridge": "Required to psr7 bridging features (~1.0)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.2-dev" + "dev-master": "5.5-dev" } }, "autoload": { - "classmap": [ - "src/Illuminate/Queue/IlluminateQueueClosure.php" - ], "files": [ "src/Illuminate/Foundation/helpers.php", "src/Illuminate/Support/helpers.php" @@ -1095,45 +958,56 @@ "authors": [ { "name": "Taylor Otwell", - "email": "taylorotwell@gmail.com" + "email": "taylor@laravel.com" } ], "description": "The Laravel Framework.", - "homepage": "http://laravel.com", + "homepage": "https://laravel.com", "keywords": [ "framework", "laravel" ], - "time": "2016-08-26 16:26:18" + "time": "2017-09-12T18:46:04+00:00" }, { "name": "laravelcollective/html", - "version": "5.2.x-dev", + "version": "5.5.x-dev", "source": { "type": "git", "url": "https://github.com/LaravelCollective/html.git", - "reference": "abec449ed8208b0b335cfc5b0f1237134477e27f" + "reference": "2f6dc39ab3655724a615fe8a652d8b7f04fc9ac6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/LaravelCollective/html/zipball/abec449ed8208b0b335cfc5b0f1237134477e27f", - "reference": "abec449ed8208b0b335cfc5b0f1237134477e27f", + "url": "https://api.github.com/repos/LaravelCollective/html/zipball/2f6dc39ab3655724a615fe8a652d8b7f04fc9ac6", + "reference": "2f6dc39ab3655724a615fe8a652d8b7f04fc9ac6", "shasum": "" }, "require": { - "illuminate/http": "5.2.*", - "illuminate/routing": "5.2.*", - "illuminate/session": "5.2.*", - "illuminate/support": "5.2.*", - "illuminate/view": "5.2.*", - "php": ">=5.5.9" + "illuminate/http": "5.5.*", + "illuminate/routing": "5.5.*", + "illuminate/session": "5.5.*", + "illuminate/support": "5.5.*", + "illuminate/view": "5.5.*", + "php": ">=7.0.0" }, "require-dev": { - "illuminate/database": "5.2.*", - "mockery/mockery": "~0.9", - "phpunit/phpunit": "~4.0" + "illuminate/database": "5.5.*", + "mockery/mockery": "~0.9.4", + "phpunit/phpunit": "~5.4" }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "Collective\\Html\\HtmlServiceProvider" + ], + "aliases": { + "Form": "Collective\\Html\\FormFacade", + "Html": "Collective\\Html\\HtmlFacade" + } + } + }, "autoload": { "psr-4": { "Collective\\Html\\": "src/" @@ -1158,7 +1032,7 @@ ], "description": "HTML and Form Builders for the Laravel Framework", "homepage": "http://laravelcollective.com", - "time": "2016-07-12 14:16:43" + "time": "2017-08-31T14:46:03+00:00" }, { "name": "league/flysystem", @@ -1166,16 +1040,16 @@ "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "f2ccd52d8e8a271fb340f6636e01d24673e8087b" + "reference": "3245df3acae2dded99694b499d3bbf937679c8f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f2ccd52d8e8a271fb340f6636e01d24673e8087b", - "reference": "f2ccd52d8e8a271fb340f6636e01d24673e8087b", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/3245df3acae2dded99694b499d3bbf937679c8f3", + "reference": "3245df3acae2dded99694b499d3bbf937679c8f3", "shasum": "" }, "require": { - "php": ">=5.4.0" + "php": ">=5.5.9" }, "conflict": { "league/flysystem-sftp": "<1.0.6" @@ -1192,13 +1066,13 @@ "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", - "league/flysystem-copy": "Allows you to use Copy.com storage", - "league/flysystem-dropbox": "Allows you to use Dropbox storage", "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", "league/flysystem-webdav": "Allows you to use WebDAV storage", - "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter" + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" }, "type": "library", "extra": { @@ -1241,30 +1115,41 @@ "sftp", "storage" ], - "time": "2016-08-26 20:18:09" + "time": "2017-09-04T09:35:39+00:00" }, { "name": "mcamara/laravel-localization", - "version": "1.1.7", + "version": "1.3.2", "source": { "type": "git", "url": "https://github.com/mcamara/laravel-localization.git", - "reference": "ff6d398d8437d0169f1d3b97e4244552a5abcced" + "reference": "86d6d9d95faf9c60decb8a3f59bfb894aace4798" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mcamara/laravel-localization/zipball/ff6d398d8437d0169f1d3b97e4244552a5abcced", - "reference": "ff6d398d8437d0169f1d3b97e4244552a5abcced", + "url": "https://api.github.com/repos/mcamara/laravel-localization/zipball/86d6d9d95faf9c60decb8a3f59bfb894aace4798", + "reference": "86d6d9d95faf9c60decb8a3f59bfb894aace4798", "shasum": "" }, "require": { - "laravel/framework": "~5.2", - "php": ">=5.5.0" + "laravel/framework": "~5.2||~5.3||~5.4||~5.5", + "php": ">=7.0.0" }, "require-dev": { - "orchestra/testbench": "3.2.*" + "orchestra/testbench-browser-kit": "~3.4", + "phpunit/phpunit": "6.0.*" }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "Mcamara\\LaravelLocalization\\LaravelLocalizationServiceProvider" + ], + "aliases": { + "LaravelLocalization": "Mcamara\\LaravelLocalization\\Facades\\LaravelLocalization" + } + } + }, "autoload": { "classmap": [], "psr-0": { @@ -1289,7 +1174,7 @@ "localization", "php" ], - "time": "2016-08-25 18:28:07" + "time": "2017-09-11T11:52:50+00:00" }, { "name": "monolog/monolog", @@ -1297,12 +1182,12 @@ "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "f42fbdfd53e306bda545845e4dbfd3e72edb4952" + "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f42fbdfd53e306bda545845e4dbfd3e72edb4952", - "reference": "f42fbdfd53e306bda545845e4dbfd3e72edb4952", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4", + "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4", "shasum": "" }, "require": { @@ -1313,7 +1198,7 @@ "psr/log-implementation": "1.0.0" }, "require-dev": { - "aws/aws-sdk-php": "^2.4.9", + "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", "graylog2/gelf-php": "~1.0", "jakub-onderka/php-parallel-lint": "0.9", @@ -1323,7 +1208,7 @@ "phpunit/phpunit-mock-objects": "2.3.0", "ruflin/elastica": ">=0.90 <3.0", "sentry/sentry": "^0.13", - "swiftmailer/swiftmailer": "~5.3" + "swiftmailer/swiftmailer": "^5.3|^6.0" }, "suggest": { "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", @@ -1367,20 +1252,20 @@ "logging", "psr-3" ], - "time": "2016-07-29 03:23:52" + "time": "2017-06-19T01:22:40+00:00" }, { "name": "mtdowling/cron-expression", - "version": "v1.1.0", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/mtdowling/cron-expression.git", - "reference": "c9ee7886f5a12902b225a1a12f36bb45f9ab89e5" + "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/c9ee7886f5a12902b225a1a12f36bb45f9ab89e5", - "reference": "c9ee7886f5a12902b225a1a12f36bb45f9ab89e5", + "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/9504fa9ea681b586028adaaa0877db4aecf32bad", + "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad", "shasum": "" }, "require": { @@ -1391,8 +1276,8 @@ }, "type": "library", "autoload": { - "psr-0": { - "Cron": "src/" + "psr-4": { + "Cron\\": "src/Cron/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1411,7 +1296,7 @@ "cron", "schedule" ], - "time": "2016-01-26 21:23:30" + "time": "2017-01-23T04:29:33+00:00" }, { "name": "nesbot/carbon", @@ -1419,26 +1304,26 @@ "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "7a026991092624a245d300685ce09ff5b4d110e0" + "reference": "926aee5ab38c2868816aa760f862a85ad01cb61a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7a026991092624a245d300685ce09ff5b4d110e0", - "reference": "7a026991092624a245d300685ce09ff5b4d110e0", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/926aee5ab38c2868816aa760f862a85ad01cb61a", + "reference": "926aee5ab38c2868816aa760f862a85ad01cb61a", "shasum": "" }, "require": { "php": ">=5.3.0", - "symfony/translation": "~2.6|~3.0" + "symfony/translation": "~2.6 || ~3.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~1.11", - "phpunit/phpunit": "~4.0|~5.0" + "friendsofphp/php-cs-fixer": "~2", + "phpunit/phpunit": "~4.0 || ~5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.22-dev" + "dev-master": "1.23-dev" } }, "autoload": { @@ -1464,71 +1349,88 @@ "datetime", "time" ], - "time": "2016-07-22 14:20:35" + "time": "2017-02-06T22:02:47+00:00" }, { - "name": "nikic/php-parser", - "version": "2.x-dev", + "name": "nwidart/laravel-menus", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "83f34e7fa4975e9646e118b61226e17cebc5db14" + "url": "https://github.com/nWidart/laravel-menus.git", + "reference": "ffebe35a127d37790395a09283e7083a13b2f444" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/83f34e7fa4975e9646e118b61226e17cebc5db14", - "reference": "83f34e7fa4975e9646e118b61226e17cebc5db14", + "url": "https://api.github.com/repos/nWidart/laravel-menus/zipball/ffebe35a127d37790395a09283e7083a13b2f444", + "reference": "ffebe35a127d37790395a09283e7083a13b2f444", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": ">=5.4" + "illuminate/config": "5.5.*", + "illuminate/support": "5.5.*", + "illuminate/view": "5.5.*", + "laravelcollective/html": "5.5.*", + "php": ">=5.6.4" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "friendsofphp/php-cs-fixer": "^2.4", + "mockery/mockery": "~0.9", + "orchestra/testbench": "3.5.*", + "phpro/grumphp": "^0.11", + "phpunit/phpunit": "~6.0" }, - "bin": [ - "bin/php-parse" - ], "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.1-dev" + "laravel": { + "providers": [ + "Nwidart\\Menus\\MenusServiceProvider" + ], + "aliases": { + "Menu": "Nwidart\\Menus\\Facades\\Menu" + } } }, "autoload": { "psr-4": { - "PhpParser\\": "lib/PhpParser" + "Nwidart\\Menus\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Nikita Popov" + "name": "Pingpong Labs", + "email": "pingpong.labs@gmail.com" + }, + { + "name": "Nicolas Widart", + "email": "n.widart@gmail.com" } ], - "description": "A PHP parser written in PHP", + "description": "Laravel Menu management", "keywords": [ - "parser", - "php" + "bootstrap", + "laravel", + "menus", + "nav", + "navigation" ], - "time": "2016-08-30 20:37:51" + "time": "2017-09-01T11:38:49+00:00" }, { "name": "paragonie/random_compat", - "version": "v1.x-dev", + "version": "v2.0.10", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "1115ffa06bad72d01735d91f51eb022db556e205" + "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/1115ffa06bad72d01735d91f51eb022db556e205", - "reference": "1115ffa06bad72d01735d91f51eb022db556e205", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/634bae8e911eefa89c1abfbf1b66da679ac8f54d", + "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d", "shasum": "" }, "require": { @@ -1563,201 +1465,56 @@ "pseudorandom", "random" ], - "time": "2016-04-03 05:47:09" + "time": "2017-03-13T16:27:32+00:00" }, { - "name": "pingpong/generators", - "version": "2.2.x-dev", + "name": "psr/container", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/pingpong-labs/generators.git", - "reference": "7649e2dfa7d9b66a649696a83959e2d68f8d6073" + "url": "https://github.com/php-fig/container.git", + "reference": "2cc4a01788191489dc7459446ba832fa79a216a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pingpong-labs/generators/zipball/7649e2dfa7d9b66a649696a83959e2d68f8d6073", - "reference": "7649e2dfa7d9b66a649696a83959e2d68f8d6073", + "url": "https://api.github.com/repos/php-fig/container/zipball/2cc4a01788191489dc7459446ba832fa79a216a7", + "reference": "2cc4a01788191489dc7459446ba832fa79a216a7", "shasum": "" }, "require": { - "doctrine/dbal": "~2.5", - "illuminate/filesystem": "5.2.*", - "illuminate/support": "5.2.*", - "php": ">=5.4.0", - "pingpong/support": "2.2.*@dev" - }, - "require-dev": { - "mockery/mockery": "~0.9", - "phpunit/phpunit": "~4" + "php": ">=5.3.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { "psr-4": { - "Pingpong\\Generators\\": "" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Pingpong Labs", - "email": "pingpong.labs@gmail.com" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "Laravel Generators", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ - "generators", - "laravel", - "pingpong" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ], - "time": "2016-02-26 04:53:40" - }, - { - "name": "pingpong/menus", - "version": "2.2.x-dev", - "source": { - "type": "git", - "url": "https://github.com/pingpong-labs/menus.git", - "reference": "03112523d3c5ff3e86997ce6e2de7fc1a5d372ca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pingpong-labs/menus/zipball/03112523d3c5ff3e86997ce6e2de7fc1a5d372ca", - "reference": "03112523d3c5ff3e86997ce6e2de7fc1a5d372ca", - "shasum": "" - }, - "require": { - "illuminate/config": "5.2.*", - "illuminate/support": "5.2.*", - "illuminate/view": "5.2.*", - "laravelcollective/html": "~5.0", - "php": ">=5.5.9" - }, - "require-dev": { - "mockery/mockery": "~0.9", - "phpunit/phpunit": "~4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Pingpong\\Menus\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Pingpong Labs", - "email": "pingpong.labs@gmail.com" - } - ], - "description": "Laravel Menus", - "keywords": [ - "bootstrap", - "laravel", - "menus", - "nav", - "navigation", - "pingpong" - ], - "time": "2016-08-23 05:51:55" - }, - { - "name": "pingpong/modules", - "version": "2.2.x-dev", - "source": { - "type": "git", - "url": "https://github.com/pingpong-labs/modules.git", - "reference": "8ee9dfcc49e56173a26b3cfdc46b6037a1400a5a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pingpong-labs/modules/zipball/8ee9dfcc49e56173a26b3cfdc46b6037a1400a5a", - "reference": "8ee9dfcc49e56173a26b3cfdc46b6037a1400a5a", - "shasum": "" - }, - "require": { - "laravel/framework": "5.2.*", - "laravelcollective/html": "~5.0", - "php": ">=5.4.0", - "pingpong/generators": "2.2.*", - "pingpong/support": "2.2.*" - }, - "require-dev": { - "mockery/mockery": "~0.9", - "phpunit/phpunit": "~4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Pingpong\\Modules\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Pingpong Labs", - "email": "pingpong.labs@gmail.com" - } - ], - "description": "Laravel Modules", - "keywords": [ - "hmvc", - "laravel", - "module", - "modules", - "pingpong" - ], - "time": "2016-01-29 04:39:40" - }, - { - "name": "pingpong/support", - "version": "2.2.x-dev", - "source": { - "type": "git", - "url": "https://github.com/pingpong-labs/support.git", - "reference": "2b4ada3e8071da1b39152cfb6a2df86f053d8bb6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pingpong-labs/support/zipball/2b4ada3e8071da1b39152cfb6a2df86f053d8bb6", - "reference": "2b4ada3e8071da1b39152cfb6a2df86f053d8bb6", - "shasum": "" - }, - "require": { - "erusev/parsedown-extra": "0.7.*", - "illuminate/filesystem": "5.2.*", - "illuminate/support": "5.2.*", - "php": ">=5.4.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Pingpong\\Support\\": "" - }, - "files": [ - "helpers.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Pingpong Labs", - "email": "pingpong.labs@gmail.com" - } - ], - "description": "Support Component of Pingpong Sky Package", - "time": "2016-01-07 08:23:04" + "time": "2017-06-28T15:35:32+00:00" }, { "name": "psr/http-message", @@ -1807,7 +1564,7 @@ "request", "response" ], - "time": "2016-08-06 14:39:51" + "time": "2016-08-06T14:39:51+00:00" }, { "name": "psr/log", @@ -1815,12 +1572,12 @@ "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "d8e60a5619fff77f9669da8997697443ef1a1d7e" + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d8e60a5619fff77f9669da8997697443ef1a1d7e", - "reference": "d8e60a5619fff77f9669da8997697443ef1a1d7e", + "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", "shasum": "" }, "require": { @@ -1854,57 +1611,34 @@ "psr", "psr-3" ], - "time": "2016-01-06 21:40:42" + "time": "2016-10-10T12:19:37+00:00" }, { - "name": "psy/psysh", - "version": "v0.7.2", + "name": "psr/simple-cache", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/bobthecow/psysh.git", - "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280" + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e64e10b20f8d229cac76399e1f3edddb57a0f280", - "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24", + "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24", "shasum": "" }, "require": { - "dnoegel/php-xdg-base-dir": "0.1", - "jakub-onderka/php-console-highlighter": "0.3.*", - "nikic/php-parser": "^1.2.1|~2.0", - "php": ">=5.3.9", - "symfony/console": "~2.3.10|^2.4.2|~3.0", - "symfony/var-dumper": "~2.7|~3.0" + "php": ">=5.3.0" }, - "require-dev": { - "fabpot/php-cs-fixer": "~1.5", - "phpunit/phpunit": "~3.7|~4.0|~5.0", - "squizlabs/php_codesniffer": "~2.0", - "symfony/finder": "~2.1|~3.0" - }, - "suggest": { - "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", - "ext-pdo-sqlite": "The doc command requires SQLite to work.", - "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", - "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." - }, - "bin": [ - "bin/psysh" - ], "type": "library", "extra": { "branch-alias": { - "dev-develop": "0.8.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { - "files": [ - "src/Psy/functions.php" - ], "psr-4": { - "Psy\\": "src/Psy/" + "Psr\\SimpleCache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1913,45 +1647,128 @@ ], "authors": [ { - "name": "Justin Hileman", - "email": "justin@justinhileman.info", - "homepage": "http://justinhileman.com" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "An interactive shell for modern PHP.", - "homepage": "http://psysh.org", + "description": "Common interfaces for simple caching", "keywords": [ - "REPL", - "console", - "interactive", - "shell" + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" ], - "time": "2016-03-09 05:03:14" + "time": "2017-01-02T13:31:39+00:00" }, { - "name": "swiftmailer/swiftmailer", - "version": "5.x-dev", + "name": "ramsey/uuid", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "0b3e60404c3e398f521e9f366555678178695d91" + "url": "https://github.com/ramsey/uuid.git", + "reference": "0ef23d1b10cf1bc576e9d865a7e9c47982c5715e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/0b3e60404c3e398f521e9f366555678178695d91", - "reference": "0b3e60404c3e398f521e9f366555678178695d91", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/0ef23d1b10cf1bc576e9d865a7e9c47982c5715e", + "reference": "0ef23d1b10cf1bc576e9d865a7e9c47982c5715e", "shasum": "" }, "require": { - "php": ">=5.3.3" + "paragonie/random_compat": "^1.0|^2.0", + "php": "^5.4 || ^7.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" }, "require-dev": { - "mockery/mockery": "~0.9.1" + "apigen/apigen": "^4.1", + "codeception/aspect-mock": "^1.0 | ^2.0", + "doctrine/annotations": "~1.2.0", + "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ^2.1", + "ircmaxell/random-lib": "^1.1", + "jakub-onderka/php-parallel-lint": "^0.9.0", + "mockery/mockery": "^0.9.4", + "moontoast/math": "^1.1", + "php-mock/php-mock-phpunit": "^0.3|^1.1", + "phpunit/phpunit": "^4.7|>=5.0 <5.4", + "satooshi/php-coveralls": "^0.6.1", + "squizlabs/php_codesniffer": "^2.3" + }, + "suggest": { + "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", + "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", + "ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", + "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.4-dev" + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marijn Huizendveld", + "email": "marijn.huizendveld@gmail.com" + }, + { + "name": "Thibaud Fabre", + "email": "thibaud@aztech.io" + }, + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).", + "homepage": "https://github.com/ramsey/uuid", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "time": "2017-08-04T13:39:04+00:00" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "1a2f9df896c8bfa6e22e8e1a78cca637c6f70613" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/1a2f9df896c8bfa6e22e8e1a78cca637c6f70613", + "reference": "1a2f9df896c8bfa6e22e8e1a78cca637c6f70613", + "shasum": "" + }, + "require": { + "egulias/email-validator": "~2.0", + "php": ">=7.0.0" + }, + "require-dev": { + "mockery/mockery": "~0.9.1", + "symfony/phpunit-bridge": "~3.3@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.0-dev" } }, "autoload": { @@ -1973,46 +1790,55 @@ } ], "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "http://swiftmailer.org", + "homepage": "http://swiftmailer.symfony.com", "keywords": [ "email", "mail", "mailer" ], - "time": "2016-08-19 20:47:22" + "time": "2017-08-29T20:44:31+00:00" }, { "name": "symfony/console", - "version": "3.0.x-dev", + "version": "3.4.x-dev", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "926061e74229e935d3c5b4e9ba87237316c6693f" + "reference": "ed85f121340bfeb8378cf736a1332a505f8382f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/926061e74229e935d3c5b4e9ba87237316c6693f", - "reference": "926061e74229e935d3c5b4e9ba87237316c6693f", + "url": "https://api.github.com/repos/symfony/console/zipball/ed85f121340bfeb8378cf736a1332a505f8382f1", + "reference": "ed85f121340bfeb8378cf736a1332a505f8382f1", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^5.5.9|>=7.0.8", + "symfony/debug": "~2.8|~3.0|~4.0", "symfony/polyfill-mbstring": "~1.0" }, + "conflict": { + "symfony/dependency-injection": "<3.3", + "symfony/process": "<3.3" + }, "require-dev": { "psr/log": "~1.0", - "symfony/event-dispatcher": "~2.8|~3.0", - "symfony/process": "~2.8|~3.0" + "symfony/config": "~3.3|~4.0", + "symfony/dependency-injection": "~3.3|~4.0", + "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/process": "~3.3|~4.0" }, "suggest": { "psr/log": "For using the console logger", "symfony/event-dispatcher": "", + "symfony/lock": "", "symfony/process": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -2039,37 +1865,89 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2016-07-30 07:22:48" + "time": "2017-09-11T21:23:16+00:00" }, { - "name": "symfony/debug", + "name": "symfony/css-selector", "version": "3.0.x-dev", "source": { "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a" + "url": "https://github.com/symfony/css-selector.git", + "reference": "b8999c1f33c224b2b66b38253f5e3a838d0d0115" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/697c527acd9ea1b2d3efac34d9806bf255278b0a", - "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/b8999c1f33c224b2b66b38253f5e3a838d0d0115", + "reference": "b8999c1f33c224b2b66b38253f5e3a838d0d0115", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": ">=5.5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony CssSelector Component", + "homepage": "https://symfony.com", + "time": "2016-06-29T05:40:00+00:00" + }, + { + "name": "symfony/debug", + "version": "3.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "14076792065c98c32c234fbb94da9a478b394281" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/14076792065c98c32c234fbb94da9a478b394281", + "reference": "14076792065c98c32c234fbb94da9a478b394281", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", "psr/log": "~1.0" }, "conflict": { "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" }, "require-dev": { - "symfony/class-loader": "~2.8|~3.0", - "symfony/http-kernel": "~2.8|~3.0" + "symfony/http-kernel": "~2.8|~3.0|~4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -2096,7 +1974,7 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2016-07-30 07:22:48" + "time": "2017-09-12T08:02:51+00:00" }, { "name": "symfony/event-dispatcher", @@ -2104,23 +1982,26 @@ "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "5382f4c882e73c267c80b8edcd482a76ef62bbe2" + "reference": "e7aca240dda99d78e4a51f4eee1390207a4dc8f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/5382f4c882e73c267c80b8edcd482a76ef62bbe2", - "reference": "5382f4c882e73c267c80b8edcd482a76ef62bbe2", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e7aca240dda99d78e4a51f4eee1390207a4dc8f8", + "reference": "e7aca240dda99d78e4a51f4eee1390207a4dc8f8", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^7.1.3" + }, + "conflict": { + "symfony/dependency-injection": "<3.4" }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0", - "symfony/dependency-injection": "~2.8|~3.0", - "symfony/expression-language": "~2.8|~3.0", - "symfony/stopwatch": "~2.8|~3.0" + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0" }, "suggest": { "symfony/dependency-injection": "", @@ -2129,7 +2010,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2156,29 +2037,29 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2016-07-19 10:47:02" + "time": "2017-09-11T20:45:27+00:00" }, { "name": "symfony/finder", - "version": "3.0.x-dev", + "version": "3.4.x-dev", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "3eb4e64c6145ef8b92adefb618a74ebdde9e3fe9" + "reference": "c661886c5a8f6398300812ae31445cd078af2a57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/3eb4e64c6145ef8b92adefb618a74ebdde9e3fe9", - "reference": "3eb4e64c6145ef8b92adefb618a74ebdde9e3fe9", + "url": "https://api.github.com/repos/symfony/finder/zipball/c661886c5a8f6398300812ae31445cd078af2a57", + "reference": "c661886c5a8f6398300812ae31445cd078af2a57", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -2205,33 +2086,33 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2016-06-29 05:40:00" + "time": "2017-09-11T20:45:17+00:00" }, { "name": "symfony/http-foundation", - "version": "3.0.x-dev", + "version": "3.4.x-dev", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "49ba00f8ede742169cb6b70abe33243f4d673f82" + "reference": "eb635edacc95e9be0eaed39d65f7e320efb6f70c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/49ba00f8ede742169cb6b70abe33243f4d673f82", - "reference": "49ba00f8ede742169cb6b70abe33243f4d673f82", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/eb635edacc95e9be0eaed39d65f7e320efb6f70c", + "reference": "eb635edacc95e9be0eaed39d65f7e320efb6f70c", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^5.5.9|>=7.0.8", "symfony/polyfill-mbstring": "~1.1" }, "require-dev": { - "symfony/expression-language": "~2.8|~3.0" + "symfony/expression-language": "~2.8|~3.0|~4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -2258,52 +2139,55 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2016-07-17 13:54:30" + "time": "2017-09-11T21:34:45+00:00" }, { "name": "symfony/http-kernel", - "version": "3.0.x-dev", + "version": "3.4.x-dev", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "03ac7bbc8fccbf002e0bea88dbe09262b29dc2a9" + "reference": "a29b12f878f1493428cca25997c4199955b2bc0e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/03ac7bbc8fccbf002e0bea88dbe09262b29dc2a9", - "reference": "03ac7bbc8fccbf002e0bea88dbe09262b29dc2a9", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/a29b12f878f1493428cca25997c4199955b2bc0e", + "reference": "a29b12f878f1493428cca25997c4199955b2bc0e", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^5.5.9|>=7.0.8", "psr/log": "~1.0", - "symfony/debug": "~2.8|~3.0", - "symfony/event-dispatcher": "~2.8|~3.0", - "symfony/http-foundation": "~2.8.8|~3.0.8|~3.1.2|~3.2" + "symfony/debug": "~2.8|~3.0|~4.0", + "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/http-foundation": "~3.3|~4.0" }, "conflict": { - "symfony/config": "<2.8" + "symfony/config": "<2.8", + "symfony/dependency-injection": "<3.4", + "symfony/var-dumper": "<3.3", + "twig/twig": "<1.34|<2.4,>=2" }, "require-dev": { - "symfony/browser-kit": "~2.8|~3.0", + "psr/cache": "~1.0", + "symfony/browser-kit": "~2.8|~3.0|~4.0", "symfony/class-loader": "~2.8|~3.0", - "symfony/config": "~2.8|~3.0", - "symfony/console": "~2.8|~3.0", - "symfony/css-selector": "~2.8|~3.0", - "symfony/dependency-injection": "~2.8|~3.0", - "symfony/dom-crawler": "~2.8|~3.0", - "symfony/expression-language": "~2.8|~3.0", - "symfony/finder": "~2.8|~3.0", - "symfony/process": "~2.8|~3.0", - "symfony/routing": "~2.8|~3.0", - "symfony/stopwatch": "~2.8|~3.0", - "symfony/templating": "~2.8|~3.0", - "symfony/translation": "~2.8|~3.0", - "symfony/var-dumper": "~2.8|~3.0" + "symfony/config": "~2.8|~3.0|~4.0", + "symfony/console": "~2.8|~3.0|~4.0", + "symfony/css-selector": "~2.8|~3.0|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/dom-crawler": "~2.8|~3.0|~4.0", + "symfony/expression-language": "~2.8|~3.0|~4.0", + "symfony/finder": "~2.8|~3.0|~4.0", + "symfony/process": "~2.8|~3.0|~4.0", + "symfony/routing": "~2.8|~3.0|~4.0", + "symfony/stopwatch": "~2.8|~3.0|~4.0", + "symfony/templating": "~2.8|~3.0|~4.0", + "symfony/translation": "~2.8|~3.0|~4.0", + "symfony/var-dumper": "~3.3|~4.0" }, "suggest": { "symfony/browser-kit": "", - "symfony/class-loader": "", "symfony/config": "", "symfony/console": "", "symfony/dependency-injection": "", @@ -2313,7 +2197,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -2340,7 +2224,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2016-07-30 09:29:03" + "time": "2017-09-11T21:23:16+00:00" }, { "name": "symfony/polyfill-mbstring", @@ -2348,12 +2232,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "53ad9faffe141fbe8f98cd6a7fd9a5e84513f56c" + "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/53ad9faffe141fbe8f98cd6a7fd9a5e84513f56c", - "reference": "53ad9faffe141fbe8f98cd6a7fd9a5e84513f56c", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7c8fae0ac1d216eb54349e6a8baa57d515fe8803", + "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803", "shasum": "" }, "require": { @@ -2365,7 +2249,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.5-dev" } }, "autoload": { @@ -2399,137 +2283,29 @@ "portable", "shim" ], - "time": "2016-08-30 17:06:17" - }, - { - "name": "symfony/polyfill-php56", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php56.git", - "reference": "3dd0fbb5810358b86b5a8ebb4529134597a0f95f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/3dd0fbb5810358b86b5a8ebb4529134597a0f95f", - "reference": "3dd0fbb5810358b86b5a8ebb4529134597a0f95f", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/polyfill-util": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php56\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "time": "2016-08-17 08:39:54" - }, - { - "name": "symfony/polyfill-util", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-util.git", - "reference": "ef830ce3d218e622b221d6bfad42c751d974bf99" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/ef830ce3d218e622b221d6bfad42c751d974bf99", - "reference": "ef830ce3d218e622b221d6bfad42c751d974bf99", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Util\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony utilities for portability of PHP codes", - "homepage": "https://symfony.com", - "keywords": [ - "compat", - "compatibility", - "polyfill", - "shim" - ], - "time": "2016-05-18 14:26:46" + "time": "2017-06-14T15:44:48+00:00" }, { "name": "symfony/process", - "version": "3.0.x-dev", + "version": "3.4.x-dev", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "768debc5996f599c4372b322d9061dba2a4bf505" + "reference": "19d5369c0b38820685adeb119e717e292df2b46b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/768debc5996f599c4372b322d9061dba2a4bf505", - "reference": "768debc5996f599c4372b322d9061dba2a4bf505", + "url": "https://api.github.com/repos/symfony/process/zipball/19d5369c0b38820685adeb119e717e292df2b46b", + "reference": "19d5369c0b38820685adeb119e717e292df2b46b", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -2556,36 +2332,39 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2016-07-28 11:13:34" + "time": "2017-09-11T21:23:16+00:00" }, { "name": "symfony/routing", - "version": "3.0.x-dev", + "version": "3.4.x-dev", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "9038984bd9c05ab07280121e9e10f61a7231457b" + "reference": "27ec5b35a8af4dea0de400e974569cc655ef9763" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/9038984bd9c05ab07280121e9e10f61a7231457b", - "reference": "9038984bd9c05ab07280121e9e10f61a7231457b", + "url": "https://api.github.com/repos/symfony/routing/zipball/27ec5b35a8af4dea0de400e974569cc655ef9763", + "reference": "27ec5b35a8af4dea0de400e974569cc655ef9763", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "conflict": { - "symfony/config": "<2.8" + "symfony/config": "<2.8", + "symfony/dependency-injection": "<3.3", + "symfony/yaml": "<3.3" }, "require-dev": { "doctrine/annotations": "~1.0", "doctrine/common": "~2.2", "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0", - "symfony/expression-language": "~2.8|~3.0", - "symfony/http-foundation": "~2.8|~3.0", - "symfony/yaml": "~2.8|~3.0" + "symfony/config": "~2.8|~3.0|~4.0", + "symfony/dependency-injection": "~3.3|~4.0", + "symfony/expression-language": "~2.8|~3.0|~4.0", + "symfony/http-foundation": "~2.8|~3.0|~4.0", + "symfony/yaml": "~3.3|~4.0" }, "suggest": { "doctrine/annotations": "For using the annotation loader", @@ -2598,7 +2377,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -2631,34 +2410,38 @@ "uri", "url" ], - "time": "2016-06-29 05:40:00" + "time": "2017-09-11T21:23:16+00:00" }, { "name": "symfony/translation", - "version": "3.0.x-dev", + "version": "3.4.x-dev", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "eee6c664853fd0576f21ae25725cfffeafe83f26" + "reference": "eb3635f1bd757a0a13b93264e85c5fc81fe6819a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/eee6c664853fd0576f21ae25725cfffeafe83f26", - "reference": "eee6c664853fd0576f21ae25725cfffeafe83f26", + "url": "https://api.github.com/repos/symfony/translation/zipball/eb3635f1bd757a0a13b93264e85c5fc81fe6819a", + "reference": "eb3635f1bd757a0a13b93264e85c5fc81fe6819a", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^5.5.9|>=7.0.8", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/config": "<2.8" + "symfony/config": "<2.8", + "symfony/dependency-injection": "<3.4", + "symfony/yaml": "<3.3" }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0", - "symfony/intl": "~2.8|~3.0", - "symfony/yaml": "~2.8|~3.0" + "symfony/config": "~2.8|~3.0|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/finder": "~2.8|~3.0|~4.0", + "symfony/intl": "^2.8.18|^3.2.5|~4.0", + "symfony/yaml": "~3.3|~4.0" }, "suggest": { "psr/log": "To use logging capability in translator", @@ -2668,7 +2451,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -2695,36 +2478,42 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2016-07-30 07:22:48" + "time": "2017-09-12T12:37:35+00:00" }, { "name": "symfony/var-dumper", - "version": "3.0.x-dev", + "version": "3.4.x-dev", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "1f7e071aafc6676fcb6e3f0497f87c2397247377" + "reference": "3f046fae2a075208272799339f8ba17e92292de0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1f7e071aafc6676fcb6e3f0497f87c2397247377", - "reference": "1f7e071aafc6676fcb6e3f0497f87c2397247377", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3f046fae2a075208272799339f8ba17e92292de0", + "reference": "3f046fae2a075208272799339f8ba17e92292de0", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^5.5.9|>=7.0.8", "symfony/polyfill-mbstring": "~1.0" }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" + }, "require-dev": { - "twig/twig": "~1.20|~2.0" + "ext-iconv": "*", + "twig/twig": "~1.34|~2.4" }, "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", "ext-symfony_debug": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -2758,7 +2547,54 @@ "debug", "dump" ], - "time": "2016-07-26 08:03:56" + "time": "2017-09-11T21:23:16+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "ab03919dfd85a74ae0372f8baf9f3c7d5c03b04b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/ab03919dfd85a74ae0372f8baf9f3c7d5c03b04b", + "reference": "ab03919dfd85a74ae0372f8baf9f3c7d5c03b04b", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7", + "symfony/css-selector": "^2.7|~3.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8|5.1.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "time": "2016-09-20T12:50:39+00:00" }, { "name": "vlucas/phpdotenv", @@ -2766,12 +2602,12 @@ "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c" + "reference": "3dd3d8f90e6604e75cca48ec32b033b50b05135b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c", - "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/3dd3d8f90e6604e75cca48ec32b033b50b05135b", + "reference": "3dd3d8f90e6604e75cca48ec32b033b50b05135b", "shasum": "" }, "require": { @@ -2808,20 +2644,20 @@ "env", "environment" ], - "time": "2016-09-01 10:05:43" + "time": "2017-08-08T20:02:34+00:00" }, { "name": "watson/sitemap", - "version": "2.0.14", + "version": "2.0.20", "source": { "type": "git", "url": "https://github.com/dwightwatson/sitemap.git", - "reference": "cca97f87135fc9fcaf70093453d71ec616ea90e1" + "reference": "2618d3e4e1d7cb7ae5bde3587489df76a6f37f03" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dwightwatson/sitemap/zipball/cca97f87135fc9fcaf70093453d71ec616ea90e1", - "reference": "cca97f87135fc9fcaf70093453d71ec616ea90e1", + "url": "https://api.github.com/repos/dwightwatson/sitemap/zipball/2618d3e4e1d7cb7ae5bde3587489df76a6f37f03", + "reference": "2618d3e4e1d7cb7ae5bde3587489df76a6f37f03", "shasum": "" }, "require": { @@ -2834,6 +2670,16 @@ "phpunit/phpunit": "4.3.*" }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "Watson\\Sitemap\\SitemapServiceProvider" + ], + "aliases": { + "Sitemap": "Watson\\Sitemap\\Facades\\Sitemap" + } + } + }, "autoload": { "psr-4": { "Watson\\": "src/Watson" @@ -2854,26 +2700,26 @@ "laravel", "sitemaps" ], - "time": "2016-08-18 23:27:53" + "time": "2017-06-30T01:15:34+00:00" }, { "name": "webwizo/laravel-shortcodes", - "version": "v1.0.4", + "version": "1.0.9", "source": { "type": "git", "url": "https://github.com/webwizo/laravel-shortcodes.git", - "reference": "da0774fcba968b11591693cc55b28fabe7eaf047" + "reference": "9e42444a2fe5e5d3496bfbadd7546f91d91fcf51" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webwizo/laravel-shortcodes/zipball/da0774fcba968b11591693cc55b28fabe7eaf047", - "reference": "da0774fcba968b11591693cc55b28fabe7eaf047", + "url": "https://api.github.com/repos/webwizo/laravel-shortcodes/zipball/9e42444a2fe5e5d3496bfbadd7546f91d91fcf51", + "reference": "9e42444a2fe5e5d3496bfbadd7546f91d91fcf51", "shasum": "" }, "require": { - "illuminate/contracts": "~5.2", - "illuminate/support": "~5.2", - "illuminate/view": "~5.2", + "illuminate/contracts": "~5.1|~5.2|~5.3|~5.4", + "illuminate/support": "~5.1|~5.2|~5.3|~5.4", + "illuminate/view": "~5.1|~5.2|~5.3|~5.4", "php": "~5.5|~7.0" }, "require-dev": { @@ -2883,11 +2729,6 @@ "squizlabs/php_codesniffer": "~2.3" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, "autoload": { "classmap": [ "tests/TestCase.php" @@ -2908,43 +2749,38 @@ "role": "Developer" } ], - "description": "Wordpress like shortcodes for Laravel 5.2", + "description": "Wordpress like shortcodes for Laravel 5.x", "homepage": "https://github.com/webwizo/laravel-shortcodes", "keywords": [ "laravel", "shortcodes", "wordpress" ], - "time": "2016-08-25 06:02:46" + "time": "2017-01-30T08:37:02+00:00" } ], "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "dev-master", + "version": "2.4.x-dev", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "5056a3878db4ab7ac232d5a075d54aaa590c2d27" + "reference": "b45cee906d15a798ae60db8edf71b31355dba929" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/5056a3878db4ab7ac232d5a075d54aaa590c2d27", - "reference": "5056a3878db4ab7ac232d5a075d54aaa590c2d27", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/b45cee906d15a798ae60db8edf71b31355dba929", + "reference": "b45cee906d15a798ae60db8edf71b31355dba929", "shasum": "" }, "require": { - "illuminate/support": "5.1.*|5.2.*|5.3.*", - "maximebf/debugbar": "~1.11.0|~1.12.0", + "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*|5.5.*", + "maximebf/debugbar": "~1.14.0", "php": ">=5.5.9", "symfony/finder": "~2.7|~3.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - } - }, "autoload": { "psr-4": { "Barryvdh\\Debugbar\\": "src/" @@ -2971,7 +2807,7 @@ "profiler", "webprofiler" ], - "time": "2016-08-25 20:55:54" + "time": "2017-09-06T08:02:33+00:00" }, { "name": "doctrine/instantiator", @@ -2979,28 +2815,28 @@ "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "416fb8ad1d095a87f1d21bc40711843cd122fd4a" + "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/416fb8ad1d095a87f1d21bc40711843cd122fd4a", - "reference": "416fb8ad1d095a87f1d21bc40711843cd122fd4a", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", + "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", "shasum": "" }, "require": { - "php": ">=5.3,<8.0-DEV" + "php": "^7.1" }, "require-dev": { "athletic/athletic": "~0.1.8", "ext-pdo": "*", "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~2.0" + "phpunit/phpunit": "^6.2.3", + "squizlabs/php_codesniffer": "^3.0.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -3025,7 +2861,7 @@ "constructor", "instantiate" ], - "time": "2016-03-31 10:24:22" + "time": "2017-07-22T11:58:36+00:00" }, { "name": "fzaninotto/faker", @@ -3033,26 +2869,26 @@ "source": { "type": "git", "url": "https://github.com/fzaninotto/Faker.git", - "reference": "efcde03be3051be1045515fb1520451283357fbb" + "reference": "95b16a4802b998f330f8a8bfc3fa4e412a7ce05b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/efcde03be3051be1045515fb1520451283357fbb", - "reference": "efcde03be3051be1045515fb1520451283357fbb", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/95b16a4802b998f330f8a8bfc3fa4e412a7ce05b", + "reference": "95b16a4802b998f330f8a8bfc3fa4e412a7ce05b", "shasum": "" }, "require": { - "php": "^5.3.3|^7.0" + "php": "^5.3.3 || ^7.0" }, "require-dev": { "ext-intl": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~1.5" + "phpunit/phpunit": "^4.0 || ^5.0", + "squizlabs/php_codesniffer": "^1.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6.x-dev" + "dev-master": "1.8-dev" } }, "autoload": { @@ -3075,7 +2911,7 @@ "faker", "fixtures" ], - "time": "2016-09-01 09:55:47" + "time": "2017-09-08T09:53:19+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -3126,50 +2962,7 @@ "keywords": [ "test" ], - "time": "2016-01-19 12:08:55" - }, - { - "name": "ignasbernotas/laravel-model-generator", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/ignasbernotas/laravel-model-generator.git", - "reference": "343ad81e5ec64b224aff01e7054e98faf98f1c61" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ignasbernotas/laravel-model-generator/zipball/343ad81e5ec64b224aff01e7054e98faf98f1c61", - "reference": "343ad81e5ec64b224aff01e7054e98faf98f1c61", - "shasum": "" - }, - "require": { - "illuminate/support": "~5.0", - "php": ">=5.4.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Iber\\Generator\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ignas Bernotas", - "email": "ignas@iber.lt" - } - ], - "description": "Laravel 5 model generator from existing schema", - "keywords": [ - "generator", - "laravel", - "model", - "schema" - ], - "time": "2016-05-24 16:57:40" + "time": "2016-01-19T12:08:55+00:00" }, { "name": "maximebf/debugbar", @@ -3177,12 +2970,12 @@ "source": { "type": "git", "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "c639a8435172116f4edf6d1cdad64801b1f2fad6" + "reference": "82a53b6ed8b16e3f7527d9a6f2e4bea68c6b14d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/c639a8435172116f4edf6d1cdad64801b1f2fad6", - "reference": "c639a8435172116f4edf6d1cdad64801b1f2fad6", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/82a53b6ed8b16e3f7527d9a6f2e4bea68c6b14d8", + "reference": "82a53b6ed8b16e3f7527d9a6f2e4bea68c6b14d8", "shasum": "" }, "require": { @@ -3201,7 +2994,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.12-dev" + "dev-master": "1.14-dev" } }, "autoload": { @@ -3230,20 +3023,20 @@ "debug", "debugbar" ], - "time": "2016-08-28 15:57:48" + "time": "2017-08-31T09:05:54+00:00" }, { "name": "mockery/mockery", "version": "0.9.x-dev", "source": { "type": "git", - "url": "https://github.com/padraic/mockery.git", - "reference": "dc369985a60578ca38f3525e98c1038f84153bc6" + "url": "https://github.com/mockery/mockery.git", + "reference": "80ac8060487db317c133ee00154f0862bd4d4ec7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/padraic/mockery/zipball/dc369985a60578ca38f3525e98c1038f84153bc6", - "reference": "dc369985a60578ca38f3525e98c1038f84153bc6", + "url": "https://api.github.com/repos/mockery/mockery/zipball/80ac8060487db317c133ee00154f0862bd4d4ec7", + "reference": "80ac8060487db317c133ee00154f0862bd4d4ec7", "shasum": "" }, "require": { @@ -3271,7 +3064,7 @@ ], "authors": [ { - "name": "Pádraic Brady", + "name": "Padraic Brady", "email": "padraic.brady@gmail.com", "homepage": "http://blog.astrumfutura.com" }, @@ -3295,7 +3088,7 @@ "test double", "testing" ], - "time": "2016-09-03 07:05:34" + "time": "2017-06-07T08:41:50+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -3303,12 +3096,12 @@ "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", - "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", "shasum": "" }, "require": { @@ -3349,26 +3142,26 @@ "reflection", "static analysis" ], - "time": "2015-12-27 11:43:31" + "time": "2017-09-11T18:02:19+00:00" }, { "name": "phpdocumentor/reflection-docblock", - "version": "3.1.0", + "version": "4.1.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "9270140b940ff02e58ec577c237274e92cd40cdd" + "reference": "2d3d238c433cf69caeb4842e97a3223a116f94b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9270140b940ff02e58ec577c237274e92cd40cdd", - "reference": "9270140b940ff02e58ec577c237274e92cd40cdd", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/2d3d238c433cf69caeb4842e97a3223a116f94b2", + "reference": "2d3d238c433cf69caeb4842e97a3223a116f94b2", "shasum": "" }, "require": { - "php": ">=5.5", + "php": "^7.0", "phpdocumentor/reflection-common": "^1.0@dev", - "phpdocumentor/type-resolver": "^0.2.0", + "phpdocumentor/type-resolver": "^0.4.0", "webmozart/assert": "^1.0" }, "require-dev": { @@ -3394,24 +3187,24 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2016-06-10 09:48:41" + "time": "2017-08-30T18:51:59+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "0.2", + "version": "0.4.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443" + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443", - "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", "shasum": "" }, "require": { - "php": ">=5.5", + "php": "^5.5 || ^7.0", "phpdocumentor/reflection-common": "^1.0" }, "require-dev": { @@ -3441,7 +3234,7 @@ "email": "me@mikevanriel.com" } ], - "time": "2016-06-10 07:14:17" + "time": "2017-07-14T14:27:02+00:00" }, { "name": "phpspec/prophecy", @@ -3449,28 +3242,29 @@ "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "d883566b83ae601a50b38b249e92450dc57cf875" + "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d883566b83ae601a50b38b249e92450dc57cf875", - "reference": "d883566b83ae601a50b38b249e92450dc57cf875", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6", + "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", - "sebastian/comparator": "^1.1", - "sebastian/recursion-context": "^1.0" + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", + "sebastian/comparator": "^1.1|^2.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0" }, "require-dev": { - "phpspec/phpspec": "^2.0" + "phpspec/phpspec": "^2.5|^3.2", + "phpunit/phpunit": "^4.8 || ^5.6.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6.x-dev" + "dev-master": "1.7.x-dev" } }, "autoload": { @@ -3503,7 +3297,7 @@ "spy", "stub" ], - "time": "2016-07-19 16:08:43" + "time": "2017-09-04T11:05:03+00:00" }, { "name": "phpunit/php-code-coverage", @@ -3565,7 +3359,7 @@ "testing", "xunit" ], - "time": "2015-10-06 15:47:00" + "time": "2015-10-06T15:47:00+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3573,12 +3367,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" + "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", + "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", "shasum": "" }, "require": { @@ -3612,7 +3406,7 @@ "filesystem", "iterator" ], - "time": "2015-06-21 13:08:43" + "time": "2016-10-03T07:40:28+00:00" }, { "name": "phpunit/php-text-template", @@ -3653,29 +3447,34 @@ "keywords": [ "template" ], - "time": "2015-06-21 13:50:34" + "time": "2015-06-21T13:50:34+00:00" }, { "name": "phpunit/php-timer", - "version": "1.0.8", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260" + "reference": "d107f347d368dd8a384601398280c7c608390ab7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260", - "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/d107f347d368dd8a384601398280c7c608390ab7", + "reference": "d107f347d368dd8a384601398280c7c608390ab7", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^5.3.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "~4|~5" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -3697,20 +3496,20 @@ "keywords": [ "timer" ], - "time": "2016-05-12 18:03:57" + "time": "2017-03-07T15:42:04+00:00" }, { "name": "phpunit/php-token-stream", - "version": "dev-master", + "version": "1.4.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "cab6c6fefee93d7b7c3a01292a0fe0884ea66644" + "reference": "958103f327daef5dd0bb328dec53e0a9e43cfaf7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/cab6c6fefee93d7b7c3a01292a0fe0884ea66644", - "reference": "cab6c6fefee93d7b7c3a01292a0fe0884ea66644", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/958103f327daef5dd0bb328dec53e0a9e43cfaf7", + "reference": "958103f327daef5dd0bb328dec53e0a9e43cfaf7", "shasum": "" }, "require": { @@ -3746,7 +3545,7 @@ "keywords": [ "tokenizer" ], - "time": "2015-09-23 14:46:55" + "time": "2017-03-07T08:21:50+00:00" }, { "name": "phpunit/phpunit", @@ -3754,12 +3553,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "41433b0d64caa3f2a73e415596dfa73490c262fc" + "reference": "18e5f52e8412d23e739f7d8744e177039860e800" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/41433b0d64caa3f2a73e415596dfa73490c262fc", - "reference": "41433b0d64caa3f2a73e415596dfa73490c262fc", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/18e5f52e8412d23e739f7d8744e177039860e800", + "reference": "18e5f52e8412d23e739f7d8744e177039860e800", "shasum": "" }, "require": { @@ -3775,7 +3574,7 @@ "phpunit/php-text-template": "~1.2", "phpunit/php-timer": "^1.0.6", "phpunit/phpunit-mock-objects": "~2.3", - "sebastian/comparator": "~1.1", + "sebastian/comparator": "~1.2.2", "sebastian/diff": "~1.2", "sebastian/environment": "~1.3", "sebastian/exporter": "~1.2", @@ -3818,7 +3617,7 @@ "testing", "xunit" ], - "time": "2016-08-28 06:58:45" + "time": "2017-06-23T12:44:27+00:00" }, { "name": "phpunit/phpunit-mock-objects", @@ -3874,26 +3673,26 @@ "mock", "xunit" ], - "time": "2015-10-02 06:51:40" + "time": "2015-10-02T06:51:40+00:00" }, { "name": "sebastian/comparator", - "version": "dev-master", + "version": "1.2.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" + "reference": "18a5d97c25f408f48acaf6d1b9f4079314c5996a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/18a5d97c25f408f48acaf6d1b9f4079314c5996a", + "reference": "18a5d97c25f408f48acaf6d1b9f4079314c5996a", "shasum": "" }, "require": { "php": ">=5.3.3", "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2" + "sebastian/exporter": "~1.2 || ~2.0" }, "require-dev": { "phpunit/phpunit": "~4.4" @@ -3938,27 +3737,27 @@ "compare", "equality" ], - "time": "2015-07-26 15:48:44" + "time": "2017-03-07T10:34:43+00:00" }, { "name": "sebastian/diff", - "version": "dev-master", + "version": "1.4.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" + "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", + "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^5.3.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.8" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "type": "library", "extra": { @@ -3990,7 +3789,7 @@ "keywords": [ "diff" ], - "time": "2015-12-08 07:14:41" + "time": "2017-05-22T07:24:03+00:00" }, { "name": "sebastian/environment", @@ -3998,19 +3797,19 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea" + "reference": "67f55699c2810ff0f2cc47478bbdeda8567e68ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea", - "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/67f55699c2810ff0f2cc47478bbdeda8567e68ee", + "reference": "67f55699c2810ff0f2cc47478bbdeda8567e68ee", "shasum": "" }, "require": { "php": "^5.3.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^4.8 || ^5.0" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "type": "library", "extra": { @@ -4040,34 +3839,34 @@ "environment", "hhvm" ], - "time": "2016-08-18 05:49:44" + "time": "2017-02-28T08:18:59+00:00" }, { "name": "sebastian/exporter", - "version": "dev-master", + "version": "1.2.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" + "reference": "dcd43bcc0fd3551bd2ede0081882d549bb78225d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/dcd43bcc0fd3551bd2ede0081882d549bb78225d", + "reference": "dcd43bcc0fd3551bd2ede0081882d549bb78225d", "shasum": "" }, "require": { - "php": ">=5.3.3", - "sebastian/recursion-context": "~1.0" + "php": "^5.3.3 || ^7.0", + "sebastian/recursion-context": "^1.0" }, "require-dev": { "ext-mbstring": "*", - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -4107,27 +3906,27 @@ "export", "exporter" ], - "time": "2016-06-17 09:04:28" + "time": "2017-02-26T13:09:30+00:00" }, { "name": "sebastian/global-state", - "version": "1.1.1", + "version": "1.1.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" + "reference": "cea85a84b00f2795341ebbbca4fa396347f2494e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/cea85a84b00f2795341ebbbca4fa396347f2494e", + "reference": "cea85a84b00f2795341ebbbca4fa396347f2494e", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { - "phpunit/phpunit": "~4.2" + "phpunit/phpunit": "~4.2|~5.0" }, "suggest": { "ext-uopz": "*" @@ -4158,20 +3957,20 @@ "keywords": [ "global state" ], - "time": "2015-10-12 03:26:01" + "time": "2017-02-23T14:11:06+00:00" }, { "name": "sebastian/recursion-context", - "version": "dev-master", + "version": "1.0.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "7ff5b1b3dcc55b8ab8ae61ef99d4730940856ee7" + "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/7ff5b1b3dcc55b8ab8ae61ef99d4730940856ee7", - "reference": "7ff5b1b3dcc55b8ab8ae61ef99d4730940856ee7", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7", + "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7", "shasum": "" }, "require": { @@ -4211,7 +4010,7 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2016-01-28 05:39:29" + "time": "2016-10-03T07:41:43+00:00" }, { "name": "sebastian/version", @@ -4246,60 +4045,7 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "time": "2015-06-21 13:59:46" - }, - { - "name": "symfony/css-selector", - "version": "3.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "b8999c1f33c224b2b66b38253f5e3a838d0d0115" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/b8999c1f33c224b2b66b38253f5e3a838d0d0115", - "reference": "b8999c1f33c224b2b66b38253f5e3a838d0d0115", - "shasum": "" - }, - "require": { - "php": ">=5.5.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\CssSelector\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony CssSelector Component", - "homepage": "https://symfony.com", - "time": "2016-06-29 05:40:00" + "time": "2015-06-21T13:59:46+00:00" }, { "name": "symfony/dom-crawler", @@ -4355,27 +4101,30 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2016-07-30 07:22:48" + "time": "2016-07-30T07:22:48+00:00" }, { "name": "symfony/yaml", - "version": "dev-master", + "version": "3.4.x-dev", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "aa8be2235b5dd4e472424552390609f61996f5ab" + "reference": "c076a2d6f809130a84f99616b425b9665b3ce0a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/aa8be2235b5dd4e472424552390609f61996f5ab", - "reference": "aa8be2235b5dd4e472424552390609f61996f5ab", + "url": "https://api.github.com/repos/symfony/yaml/zipball/c076a2d6f809130a84f99616b425b9665b3ce0a5", + "reference": "c076a2d6f809130a84f99616b425b9665b3ce0a5", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" + }, + "conflict": { + "symfony/console": "<3.4" }, "require-dev": { - "symfony/console": "~2.8|~3.0" + "symfony/console": "~3.4|~4.0" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" @@ -4383,7 +4132,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -4410,7 +4159,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2016-09-02 02:14:06" + "time": "2017-09-04T13:18:59+00:00" }, { "name": "webmozart/assert", @@ -4418,12 +4167,12 @@ "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "8444f2ac9f86342665cdae47b6d3ea6e07794456" + "reference": "4a8bf11547e139e77b651365113fc12850c43d9a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/8444f2ac9f86342665cdae47b6d3ea6e07794456", - "reference": "8444f2ac9f86342665cdae47b6d3ea6e07794456", + "url": "https://api.github.com/repos/webmozart/assert/zipball/4a8bf11547e139e77b651365113fc12850c43d9a", + "reference": "4a8bf11547e139e77b651365113fc12850c43d9a", "shasum": "" }, "require": { @@ -4436,7 +4185,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -4460,16 +4209,20 @@ "check", "validate" ], - "time": "2016-08-18 09:30:53" + "time": "2016-11-23T20:04:41+00:00" } ], "aliases": [], "minimum-stability": "dev", - "stability-flags": [], + "stability-flags": { + "greggilbert/recaptcha": 20, + "doctrine/dbal": 20, + "nwidart/laravel-menus": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=5.5.9" + "php": ">=7.0.0" }, "platform-dev": [] } diff --git a/config/.gitignore b/config/.gitignore index a6acbe5b..30f2be9f 100644 --- a/config/.gitignore +++ b/config/.gitignore @@ -19,3 +19,4 @@ !sitemap.php !image.php !view.php +!recaptcha.php \ No newline at end of file diff --git a/config/app.php b/config/app.php index 8655d7a1..d62c8e9c 100644 --- a/config/app.php +++ b/config/app.php @@ -153,16 +153,14 @@ return [ Illuminate\Translation\TranslationServiceProvider::class, Illuminate\Validation\ValidationServiceProvider::class, Illuminate\View\ViewServiceProvider::class, + Illuminate\Notifications\NotificationServiceProvider::class, Mcamara\LaravelLocalization\LaravelLocalizationServiceProvider::class, - // this class must be before ModulesServiceProvider from PingPong, because it handles files module.json - App\Providers\ModuleManager::class, - Pingpong\Modules\ModulesServiceProvider::class, - Pingpong\Menus\MenusServiceProvider::class, - App\Providers\SubmodulesManager::class, + \App\CMS\ModuleManager\Providers\ModuleManager::class, + \Nwidart\Menus\MenusServiceProvider::class, Franzose\ClosureTable\ClosureTableServiceProvider::class, \Watson\Sitemap\SitemapServiceProvider::class, Intervention\Image\ImageServiceProvider::class, - Webwizo\Shortcodes\ShortcodesServiceProvider::class, +// Webwizo\Shortcodes\ShortcodesServiceProvider::class, /* * Application Service Providers... */ @@ -172,6 +170,7 @@ return [ App\Providers\RouteServiceProvider::class, App\Providers\BladeExtender::class, \App\Providers\TemplateServiceProvider::class, + \Greggilbert\Recaptcha\RecaptchaServiceProvider::class, ], /* @@ -186,7 +185,6 @@ return [ */ 'aliases' => [ - 'App' => Illuminate\Support\Facades\App::class, 'Artisan' => Illuminate\Support\Facades\Artisan::class, 'Auth' => Illuminate\Support\Facades\Auth::class, @@ -204,8 +202,7 @@ return [ 'Lang' => Illuminate\Support\Facades\Lang::class, 'Log' => Illuminate\Support\Facades\Log::class, 'Mail' => Illuminate\Support\Facades\Mail::class, - 'Menu' => Pingpong\Menus\MenuFacade::class, - 'Module' => Pingpong\Modules\Facades\Module::class, + 'Menu' => Nwidart\Menus\Facades\Menu::class, 'Password' => Illuminate\Support\Facades\Password::class, 'Queue' => Illuminate\Support\Facades\Queue::class, 'Redirect' => Illuminate\Support\Facades\Redirect::class, @@ -221,8 +218,9 @@ return [ 'Validator' => Illuminate\Support\Facades\Validator::class, 'LaravelLocalization' => Mcamara\LaravelLocalization\Facades\LaravelLocalization::class, 'View' => Illuminate\Support\Facades\View::class, + 'Recaptcha' => Greggilbert\Recaptcha\Facades\Recaptcha::class, 'Shortcode' => Webwizo\Shortcodes\Facades\Shortcode::class, - + 'Notification' => Illuminate\Support\Facades\Notification::class, ], ]; diff --git a/config/mail.php b/config/mail.php index 7c60a671..8f0edf46 100644 --- a/config/mail.php +++ b/config/mail.php @@ -111,4 +111,22 @@ return [ 'sendmail' => '/usr/sbin/sendmail -bs', + /* + |-------------------------------------------------------------------------- + | Markdown Mail Settings + |-------------------------------------------------------------------------- + | + | If you are using Markdown based email rendering, you may configure your + | theme and component paths here, allowing you to customize the design + | of the emails. Or, you may simply stick with the Laravel defaults! + | + */ + + 'markdown' => [ + 'theme' => 'default', + + 'paths' => [ + resource_path('views/vendor/mail'), + ], + ] ]; diff --git a/config/menus.php b/config/menus.php index 0fc4ae4c..9119ddb8 100644 --- a/config/menus.php +++ b/config/menus.php @@ -3,12 +3,6 @@ return [ 'styles' => [ - 'navbar' => 'Pingpong\Menus\Presenters\Bootstrap\NavbarPresenter', - 'navbar-right' => 'Pingpong\Menus\Presenters\Bootstrap\NavbarRightPresenter', - 'nav-pills' => 'Pingpong\Menus\Presenters\Bootstrap\NavPillsPresenter', - 'nav-tab' => 'Pingpong\Menus\Presenters\Bootstrap\NavTabPresenter', - 'sidebar' => 'Pingpong\Menus\Presenters\Bootstrap\SidebarMenuPresenter', - 'navmenu' => 'Pingpong\Menus\Presenters\Bootstrap\NavMenuPresenter', 'foundation-drilldown' => App\CMS\MenuPresenters\FoundationDrilldownMenuPresenter::class, 'foundation-dropdown' => App\CMS\MenuPresenters\FoundationDropdownMenuPresenter::class, 'foundation-dropdown-initialized' => App\CMS\MenuPresenters\FoundationInitializedDropdownMenuPresenter::class, diff --git a/config/modules.php b/config/modules.php index 80edfbbb..038f14dc 100644 --- a/config/modules.php +++ b/config/modules.php @@ -1,160 +1,11 @@ 'Modules', - - /* - |-------------------------------------------------------------------------- - | Module Stubs - |-------------------------------------------------------------------------- - | - | Default module stubs. - | - */ - - 'stubs' => [ - 'enabled' => false, - 'path' => base_path().'/vendor/pingpong/modules/src/Pingpong/Modules/Commands/stubs', - 'files' => [ - 'start' => 'start.php', - 'routes' => 'Http/routes.php', - 'json' => 'module.json', - 'views/index' => 'Resources/views/index.blade.php', - 'views/master' => 'Resources/views/layouts/master.blade.php', - 'scaffold/config' => 'Config/config.php', - 'composer' => 'composer.json', - ], - 'replacements' => [ - 'start' => ['LOWER_NAME'], - 'routes' => ['LOWER_NAME', 'STUDLY_NAME', 'MODULE_NAMESPACE'], - 'json' => ['LOWER_NAME', 'STUDLY_NAME', 'MODULE_NAMESPACE'], - 'views/index' => ['LOWER_NAME'], - 'views/master' => ['STUDLY_NAME'], - 'scaffold/config' => ['STUDLY_NAME'], - 'composer' => [ - 'LOWER_NAME', - 'STUDLY_NAME', - 'VENDOR', - 'AUTHOR_NAME', - 'AUTHOR_EMAIL', - 'MODULE_NAMESPACE', - ], - ], - ], - 'paths' => [ - /* - |-------------------------------------------------------------------------- - | Modules path - |-------------------------------------------------------------------------- - | - | This path used for save the generated module. This path also will added - | automatically to list of scanned folders. - | - */ - - 'modules' => base_path('modules'), - /* - |-------------------------------------------------------------------------- - | Modules assets path - |-------------------------------------------------------------------------- - | - | Here you may update the modules assets path. - | - */ - - 'assets' => public_path('modules'), - /* - |-------------------------------------------------------------------------- - | The migrations path - |-------------------------------------------------------------------------- - | - | Where you run 'module:publish-migration' command, where do you publish the - | the migration files? - | - */ - - 'migration' => base_path('database/migrations'), - /* - |-------------------------------------------------------------------------- - | Generator path - |-------------------------------------------------------------------------- - | - | Here you may update the modules generator path. - | - */ - - 'generator' => [ - 'assets' => 'Assets', - 'config' => 'Config', - 'command' => 'Console', - 'migration' => 'Database/Migrations', - 'model' => 'Entities', - 'repository' => 'Repositories', - 'seeder' => 'Database/Seeders', - 'controller' => 'Http/Controllers', - 'filter' => 'Http/Middleware', - 'request' => 'Http/Requests', - 'provider' => 'Providers', - 'lang' => 'Resources/lang', - 'views' => 'Resources/views', - 'test' => 'Tests', - ], - ], - /* - |-------------------------------------------------------------------------- - | Scan Path - |-------------------------------------------------------------------------- - | - | Here you define which folder will be scanned. By default will scan vendor - | directory. This is useful if you host the package in packagist website. - | - */ - - 'scan' => [ - 'enabled' => false, - 'paths' => [ - base_path('vendor/*/*'), - ], - ], - /* - |-------------------------------------------------------------------------- - | Composer File Template - |-------------------------------------------------------------------------- - | - | Here is the config for composer.json file, generated by this package - | in every module since version >= 1.2.0. - | - */ - - 'composer' => [ - 'vendor' => 'pingpong-modules', - 'author' => [ - 'name' => 'Pingpong Labs', - 'email' => 'pingpong.labs@gmail.com', - ], - ], - /* - |-------------------------------------------------------------------------- - | Caching - |-------------------------------------------------------------------------- - | - | Here is the config for setting up caching feature. - | - */ - 'cache' => [ - 'enabled' => false, - 'key' => 'pingpong-modules', - 'lifetime' => 60, - ], - + 'paths' => [ + 'modules' => base_path('modules'), + 'templates' => base_path('templates'), + 'assets' => public_path('modules'), + 'stubs' => base_path('app/CMS/Modules/Stubs'), + ] ]; diff --git a/config/recaptcha.php b/config/recaptcha.php new file mode 100644 index 00000000..61957b81 --- /dev/null +++ b/config/recaptcha.php @@ -0,0 +1,66 @@ + env('RECAPTCHA_PUBLIC_KEY', ''), + 'private_key' => env('RECAPTCHA_PRIVATE_KEY', ''), + + /* + |-------------------------------------------------------------------------- + | Template + |-------------------------------------------------------------------------- + | + | Set a template to use if you don't want to use the standard one. + | + */ + 'template' => '', + + /* + |-------------------------------------------------------------------------- + | Driver + |-------------------------------------------------------------------------- + | + | Determine how to call out to get response; values are 'curl' or 'native'. + | Only applies to v2. + | + */ + 'driver' => 'curl', + + /* + |-------------------------------------------------------------------------- + | Options + |-------------------------------------------------------------------------- + | + | Various options for the driver + | + */ + 'options' => [ + + 'curl_timeout' => 1, + 'curl_verify' => true, + + ], + + /* + |-------------------------------------------------------------------------- + | Version + |-------------------------------------------------------------------------- + | + | Set which version of ReCaptcha to use. + | + */ + + 'version' => 2, + +]; diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php index 96f72d25..4eb4ec98 100644 --- a/database/factories/ModelFactory.php +++ b/database/factories/ModelFactory.php @@ -28,10 +28,13 @@ $factory->define(User::class, function (Faker\Generator $faker) { }); $factory->define(Content::class, function (Faker\Generator $faker) { + + $slug = isset($faker->slug) ? $faker->slug : $faker->slug(5); + return [ 'title' => $faker->sentence(5), 'userId' => 1, - 'url' => $faker->slug(5), + 'url' => $slug, 'pageContent' => $faker->text(1500), 'metaDescription' => $faker->text, 'moduleHandler' => config('staticpages.handler'), diff --git a/database/migrations/2016_10_11_135756_AddUniqueCodeToWidgets.php b/database/migrations/2016_10_11_135756_AddUniqueCodeToWidgets.php index c8456ba9..2c24874d 100644 --- a/database/migrations/2016_10_11_135756_AddUniqueCodeToWidgets.php +++ b/database/migrations/2016_10_11_135756_AddUniqueCodeToWidgets.php @@ -1,5 +1,6 @@ dropUnique('widgets_language_container_id_unique'); - }); + try { + Schema::table('widgets', function (Blueprint $table) { + $table->dropUnique('widgets_language_container_id_unique'); + }); + } catch (\Exception $e) { + + } // migrate data - $widgets = \App\Models\Widget::all(); + $widgets = Widget::all(); foreach ($widgets as $widget) { $widget->settings = (object)json_decode($widget->settings); $widget->settings->containerClass = $widget->container_class; diff --git a/database/migrations/2016_10_25_071455_rename_column_in_contents.php b/database/migrations/2016_10_25_071455_rename_column_in_contents.php index 45b03e33..1ffcfd51 100644 --- a/database/migrations/2016_10_25_071455_rename_column_in_contents.php +++ b/database/migrations/2016_10_25_071455_rename_column_in_contents.php @@ -27,7 +27,6 @@ class RenameColumnInContents extends Migration 'url', 'meta_keywords', 'meta_description', - 'content', 'module_settings', 'status' ]; diff --git a/database/migrations/2017_08_01_181056_add_static_name_to_modules_table.php b/database/migrations/2017_08_01_181056_add_static_name_to_modules_table.php new file mode 100644 index 00000000..4818ab62 --- /dev/null +++ b/database/migrations/2017_08_01_181056_add_static_name_to_modules_table.php @@ -0,0 +1,38 @@ +string('static_name')->after('description'); + }); + + $modules = \App\Models\Module::all(); + foreach ($modules as $module) { + $module->update(['static_name' => $module->static_name]); + } + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('modules', function (Blueprint $table) { + $table->dropColumn('static_name'); + }); + } +} diff --git a/database/migrations/2017_08_01_212743_add_new_action_log_type.php b/database/migrations/2017_08_01_212743_add_new_action_log_type.php new file mode 100644 index 00000000..3e91923f --- /dev/null +++ b/database/migrations/2017_08_01_212743_add_new_action_log_type.php @@ -0,0 +1,29 @@ + 'newFile', + 'name' => 'admin/actionLog.nameNewFile', + 'value' => 'admin/actionLog.newFile' + ]); + } + + /** + * Reverse the migrations. + * @return void + */ + public function down() + { + \App\Models\ActionLog\ActionLogType::where('string_id', 'newFile') + ->delete(); + } +} diff --git a/database/migrations/2017_08_10_202656_CreatePermissionsTable.php b/database/migrations/2017_08_10_202656_CreatePermissionsTable.php new file mode 100644 index 00000000..134536f5 --- /dev/null +++ b/database/migrations/2017_08_10_202656_CreatePermissionsTable.php @@ -0,0 +1,65 @@ +increments('id'); + $table->integer('parent_id') + ->nullable() + ->unsigned(); + $table->string('string_id') + ->unique(); + $table->string('name'); + $table->string('group') + ->nullable(true); + }); + + Schema::table('permissions', function (Blueprint $table) { + $table->foreign('parent_id') + ->references('id') + ->on('permissions') + ->onDelete('set null') + ->onUpdate('cascade'); + }); + + Schema::create('user_has_permissions', function (Blueprint $table) { + $table->integer('user_id'); + $table->integer('permission_id') + ->unsigned(); + }); + + Schema::table('user_has_permissions', function (Blueprint $table) { + $table->foreign('user_id') + ->references('id') + ->on('users') + ->onDelete('cascade') + ->onUpdate('cascade'); + + $table->foreign('permission_id') + ->references('id') + ->on('permissions') + ->onDelete('cascade') + ->onUpdate('cascade'); + }); + } + + /** + * Reverse the migrations. + * @return void + */ + public function down() + { + Schema::drop('user_has_permissions'); + Schema::drop('permissions'); + } +} diff --git a/database/migrations/2017_08_10_214109_add_default_permissions.php b/database/migrations/2017_08_10_214109_add_default_permissions.php new file mode 100644 index 00000000..6e4c8d04 --- /dev/null +++ b/database/migrations/2017_08_10_214109_add_default_permissions.php @@ -0,0 +1,66 @@ +boolean('default') + ->default(false); + }); + + Permission::getQuery() + ->delete(); + + $permissions = [ + 'contents' => ['create', 'update', 'update-all', 'delete', 'set-homepage', 'publish', 'draft', 'protect', 'view-history'], + 'users' => ['create', 'update', 'delete', 'set-permissions', 'change-status', 'change-role'], + 'files' => ['upload', 'update', 'delete', 'move-to-directories'], + 'directories' => ['create', 'edit', 'delete'], + 'widgetareas' => ['create', 'edit', 'delete'], + 'widgets' => ['create', 'edit', 'delete', 'assign', 'unassign'], + 'templates' => ['copy', 'edit'], + 'actions' => [], + 'settings' => [] + ]; + foreach ($permissions as $entity => $abilities) { + + $parent = Permission::create([ + 'name' => 'admin/permissions.' . $entity . '.management', + 'string_id' => $entity . '-management', + 'group' => $entity, + 'default' => true, + ]); + + foreach ($abilities as $ability) { + Permission::create([ + 'name' => 'admin/permissions.' . $entity . '.' . $ability, + 'string_id' => $ability . '-' . $entity, + 'group' => $entity, + 'parent_id' => $parent->id, + 'default' => true, + ]); + } + } + } + + /** + * Reverse the migrations. + * @return void + */ + public function down() + { + Schema::table('permissions', function (Blueprint $table) { + $table->dropColumn('default'); + }); + } +} diff --git a/database/migrations/2017_08_24_011314_drop_custom_fields_tables.php b/database/migrations/2017_08_24_011314_drop_custom_fields_tables.php new file mode 100644 index 00000000..57a1c773 --- /dev/null +++ b/database/migrations/2017_08_24_011314_drop_custom_fields_tables.php @@ -0,0 +1,30 @@ +integer('order') + ->after('viewed') + ->default(0); + }); + } + + /** + * Reverse the migrations. + * @return void + */ + public function down() + { + Schema::table('contents', function (Blueprint $table) { + $table->dropColumn('order'); + }); + } +} diff --git a/gulpfile.js b/gulpfile.js index 4832a5de..226ae6e4 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,6 +1,19 @@ var elixir = require ('laravel-elixir'); +require ('laravel-elixir-remove') + elixir (function (mix) { + var defaultColor = "green"; + var colors = ["blue", "seagreen", 'orange', "green", 'purple', 'red']; + var outputName; + colors.forEach (function (color) { + outputName = color === defaultColor ? 'app.css' : 'app-' + color + ".css"; + mix.copy ('resources/assets/sass/admin/_themes/' + color + '-theme.scss', 'public/css/admin/theme.scss') + .sass ([ + 'admin/**/!(_imports|_variables|*-theme)*.scss', + '../admin/css' + ], 'public/css/admin/' + outputName, null, {includePaths: ['bower_components', 'resources/assets/sass/admin']}) + }) // vendor files mix @@ -13,27 +26,14 @@ elixir (function (mix) { 'tinycolor/dist/tinycolor-min.js', 'chart.js/dist/Chart.bundle.min.js', 'jquery.are-you-sure/jquery.are-you-sure.js', - '../resources/assets/admin/js/app.js', - ], 'public/js/vendor.js', 'bower_components'); - - var defaultColor = "green"; - var colors = ["blue", "seagreen", 'orange', "green", 'purple', 'red']; - var outputName; - colors.forEach (function (color) { - outputName = color == defaultColor ? 'app.css' : 'app-' + color + ".css"; - mix.copy ('resources/assets/sass/admin/_themes/' + color + '-theme.scss', 'public/css/admin/theme.scss'); - mix.sass ([ - 'admin/**/!(_imports|_variables|*-theme)*.scss', - '../admin/css/custom.css' - - ], 'public/css/admin/' + outputName, null, {includePaths: ['bower_components', 'resources/assets/sass/admin']}); - }) - - mix.copy ('bower_components/font-awesome/css/font-awesome.min.css', 'public/css'); - mix.copy ('bower_components/font-awesome/fonts', 'public/fonts'); - mix.sass (['bootstrap/bootstrap.scss'], 'public/css/admin/bootstrap.css'); - mix.styles ([ - '../../../public/css/admin/bootstrap.css', - '../../../bower_components/animate.css/animate.css', - ], 'public/css/admin/style.css'); + '../resources/assets/admin/js/*.js', + ], 'public/js/vendor.js', 'bower_components') + .copy ('bower_components/font-awesome/css/font-awesome.min.css', 'public/css') + .copy ('bower_components/font-awesome/fonts', 'public/fonts') + .sass (['bootstrap/bootstrap.scss'], 'public/css/admin/bootstrap.css') + .styles ([ + '../../../public/css/admin/bootstrap.css', + '../../../bower_components/animate.css/animate.css', + ], 'public/css/admin/style.css') + .remove ('public/css/admin/theme.scss'); }); diff --git a/index.php b/index.php index 48384dc5..3fc4bbdc 100644 --- a/index.php +++ b/index.php @@ -16,5 +16,4 @@ if ($uri !== '/' && file_exists(__DIR__ . '/public' . $uri)) { return false; } -require_once __DIR__ . '/app/CMS/Helpers/functions.php'; require_once __DIR__ . '/public/index.php'; diff --git a/modules/Blog/Article/Config/config.php b/modules/Blog/Article/Config/config.php deleted file mode 100644 index fb19fdc4..00000000 --- a/modules/Blog/Article/Config/config.php +++ /dev/null @@ -1,12 +0,0 @@ - 'Articles', - 'translatedName' => 'article::module.name', - 'translatedDescription' => 'article::module.description', - 'alias' => 'article', - 'handler' => \Modules\Blog\Article\Handlers\Article::class, - 'providers' => [\Modules\Blog\Article\Providers\ArticleServiceProvider::class], - 'files' => ['start.php'], - 'order' => 0, -]; \ No newline at end of file diff --git a/modules/Blog/Article/Entities/Article.php b/modules/Blog/Article/Entities/Article.php deleted file mode 100644 index 1222a7bb..00000000 --- a/modules/Blog/Article/Entities/Article.php +++ /dev/null @@ -1,15 +0,0 @@ -hasMany(Comment::class, 'content_id') - ->where('approved', true); - } -} \ No newline at end of file diff --git a/modules/Blog/Article/Entities/Comment.php b/modules/Blog/Article/Entities/Comment.php deleted file mode 100644 index 25a5e4f8..00000000 --- a/modules/Blog/Article/Entities/Comment.php +++ /dev/null @@ -1,27 +0,0 @@ -belongsTo(User::class, 'user_id'); - } - - public function article() - { - return $this->belongsTo(Content::class, 'content_id'); - } -} \ No newline at end of file diff --git a/modules/Blog/Article/Events/ApprovedComment.php b/modules/Blog/Article/Events/ApprovedComment.php deleted file mode 100644 index 3fab72bc..00000000 --- a/modules/Blog/Article/Events/ApprovedComment.php +++ /dev/null @@ -1,20 +0,0 @@ -comment = $comment; - } -} \ No newline at end of file diff --git a/modules/Blog/Article/Events/CreatedComment.php b/modules/Blog/Article/Events/CreatedComment.php deleted file mode 100644 index d21f685b..00000000 --- a/modules/Blog/Article/Events/CreatedComment.php +++ /dev/null @@ -1,20 +0,0 @@ -comment = $comment; - } -} \ No newline at end of file diff --git a/modules/Blog/Article/Events/DeletedComment.php b/modules/Blog/Article/Events/DeletedComment.php deleted file mode 100644 index 048341ab..00000000 --- a/modules/Blog/Article/Events/DeletedComment.php +++ /dev/null @@ -1,20 +0,0 @@ -comment = $comment; - } -} \ No newline at end of file diff --git a/modules/Blog/Article/Handlers/Article.php b/modules/Blog/Article/Handlers/Article.php deleted file mode 100644 index 9a2b2615..00000000 --- a/modules/Blog/Article/Handlers/Article.php +++ /dev/null @@ -1,153 +0,0 @@ -whereTitle(trans('article::module.blog')); - if (!$blogSubmenu) { - $blogSubmenu = $menu->dropdown(trans('article::module.blog'), function ($sub) { - }, 20, ['icon' => 'fa fa-fw fa-book']); - } - - $blogSubmenu->dropdown(trans('article::module.name'), function ($sub) { - $sub->route('content.new', trans('article::article.new'), ['id' => config('article.alias')], 10, ['icon' => 'fa fa-fw fa-pencil']); - $sub->route('content.overview', trans('article::article.overview'), ['id' => config('article.alias')], 30, ['icon' => 'fa fa-fw fa-book']); - }, 10, ['icon' => 'fa fa-fw fa-book']); - - $blogSubmenu->route('comments.overview', trans('article::module.commentsOverview'), [], 20, ['icon' => 'fa fa-fw fa-commenting-o']); - } - - /** - * Install module - */ - public static function install() - { - $types = [ - [ - 'string_id' => 'commentCreated', - 'name' => 'article::comments.events.names.commentCreated', - 'value' => 'article::comments.events.descriptions.commentCreated', - ], - [ - 'string_id' => 'commentDeleted', - 'name' => 'article::comments.events.names.commentDeleted', - 'value' => 'article::comments.events.descriptions.commentDeleted', - ], - [ - 'string_id' => 'commentApproved', - 'name' => 'article::comments.events.names.commentApproved', - 'value' => 'article::comments.events.descriptions.commentApproved', - ], - - ]; - foreach ($types as $type) { - ActionLogType::create($type); - } - } - - /** - * Uninstalls module - * - * @param Module $module - * - * @return mixed|void - */ - public static function uninstall(Module $module) - { - ActionLogType::whereIn('string_id', ['commentCreated', 'commentDeleted', 'commentApproved']) - ->delete(); - } - - /** - * Get translated title for pages overview of given type. - * - * This value is used for rendering list of all content pages of given type in administration. - * - * @return string - */ - public static function getOverviewTitle() - { - return trans('article::module.allArticles'); - } - - /** - * Title displayed above for for creating new content page - * - * @return string - */ - public static function getCreateNewTitle() - { - return trans('article::module.newArticle'); - } - - /** - * Title for form displayed for editin content page - * - * @param Content $content - * - * @return mixed - */ - public static function getEditTitle(Content $content) - { - return trans('article::module.editArticle'); - } - - /** - * Method called right after content page is marked as deleted - * - * This method is supposed to clean after "deleted" page. - * - * @param Content $content - * - * @return mixed - */ - public static function delete(Content $content) - { - } - - /** - * Does this module support categories? - * - * @return boolean - */ - public static function supportCategories() - { - return true; - } -} \ No newline at end of file diff --git a/modules/Blog/Article/Http/Controllers/Admin/CommentsOverview.php b/modules/Blog/Article/Http/Controllers/Admin/CommentsOverview.php deleted file mode 100644 index 9293d2b1..00000000 --- a/modules/Blog/Article/Http/Controllers/Admin/CommentsOverview.php +++ /dev/null @@ -1,19 +0,0 @@ -with('author') - ->orderBy('approved') - ->orderBy('created_at', 'DESC') - ->paginate(25); - - return view('article::admin/comments.overview', ['comments' => $comments]); - } -} \ No newline at end of file diff --git a/modules/Blog/Article/Http/Controllers/Admin/EditComment.php b/modules/Blog/Article/Http/Controllers/Admin/EditComment.php deleted file mode 100644 index 969f845d..00000000 --- a/modules/Blog/Article/Http/Controllers/Admin/EditComment.php +++ /dev/null @@ -1,37 +0,0 @@ -approved = 1; - $comment->save(); - - Event::fire(new ApprovedComment($comment)); - - return redirect() - ->back() - ->with('success', trans('article::comments.approved')); - } - - public function delete($id) - { - $comment = Comment::findOrFail($id); - - Event::fire(new DeletedComment($comment)); - - $comment->delete(); - - return redirect() - ->back() - ->with('success', trans('article::comments.deleted')); - } -} \ No newline at end of file diff --git a/modules/Blog/Article/Http/Controllers/Visitor/CreateNewComment.php b/modules/Blog/Article/Http/Controllers/Visitor/CreateNewComment.php deleted file mode 100644 index c274f653..00000000 --- a/modules/Blog/Article/Http/Controllers/Visitor/CreateNewComment.php +++ /dev/null @@ -1,48 +0,0 @@ -moduleSettings['allowComments']) || !$article->moduleSettings['allowComments']) { - return redirect() - ->route('page.content', ['url' => $article->url]) - ->with('error', trans('article::comments.disabledComments')); - } - - $content = $request->message; - $user = Auth::user(); - if ($user) { - $name = is_null($user->name) ? $user->email : $user->name; - $email = $user->email; - } else { - $name = $request->name; - $email = $request->email; - } - - $comment = Comment::create([ - 'user_id' => $user ? $user->id : null, - 'content_id' => $article->id, - 'name' => $name, - 'email' => $email, - 'content' => $content, - 'approved' => !is_null($user) - ]); - - // fire event about new comment - Event::fire(new CreatedComment($comment)); - - return redirect() - ->route('page.content', ['url' => $article->url]) - ->with('success', trans('article::comments.saved')); - } -} \ No newline at end of file diff --git a/modules/Blog/Article/Http/Requests/CreateNewComment.php b/modules/Blog/Article/Http/Requests/CreateNewComment.php deleted file mode 100644 index 18044f43..00000000 --- a/modules/Blog/Article/Http/Requests/CreateNewComment.php +++ /dev/null @@ -1,28 +0,0 @@ - 'required']; - - if (!$user) { - $required['name'] = 'required'; - $required['email'] = 'required|email'; - } - - return $required; - } -} diff --git a/modules/Blog/Article/Http/routes.php b/modules/Blog/Article/Http/routes.php deleted file mode 100644 index 145c30ba..00000000 --- a/modules/Blog/Article/Http/routes.php +++ /dev/null @@ -1,28 +0,0 @@ - LaravelLocalization::setLocale(), - 'namespace' => 'Modules\Blog\Article\Http\Controllers' - ], function () { - Route::group([ - 'middleware' => ['admin'], - 'prefix' => 'admin/comments', - 'namespace' => 'Admin' - ], function () { - - Route::get('/', 'CommentsOverview@getOverview') - ->name('comments.overview'); - - Route::get('/delete/{id}', 'EditComment@delete') - ->name('comments.delete'); - - Route::get('/approve/{id}', 'EditComment@approve') - ->name('comments.approve'); - }); - - // public routes - Route::group(['middleware' => ['web'], 'namespace' => 'Visitor'], function () { - - Route::post('comments/new/{article}', 'CreateNewComment@store') - ->name('comments.new'); - }); -}); \ No newline at end of file diff --git a/modules/Blog/Article/Listeners/LogCommentApproval.php b/modules/Blog/Article/Listeners/LogCommentApproval.php deleted file mode 100644 index 2ff4f14b..00000000 --- a/modules/Blog/Article/Listeners/LogCommentApproval.php +++ /dev/null @@ -1,35 +0,0 @@ - $event->comment->name, - 'email' => $event->comment->email, - 'content' => $event->comment->content - ]; - - $this->saveLog($parameters); - } - - /** - * Getter for action name. Used only internally - * - * @return mixed - */ - protected function getName() - { - return 'commentApproved'; - } -} \ No newline at end of file diff --git a/modules/Blog/Article/Listeners/LogDeletedComment.php b/modules/Blog/Article/Listeners/LogDeletedComment.php deleted file mode 100644 index 0a016e0c..00000000 --- a/modules/Blog/Article/Listeners/LogDeletedComment.php +++ /dev/null @@ -1,35 +0,0 @@ - $event->comment->name, - 'email' => $event->comment->email, - 'content' => $event->comment->content - ]; - - $this->saveLog($parameters); - } - - /** - * Getter for action name. Used only internally - * - * @return mixed - */ - protected function getName() - { - return 'commentDeleted'; - } -} \ No newline at end of file diff --git a/modules/Blog/Article/Listeners/LogNewComment.php b/modules/Blog/Article/Listeners/LogNewComment.php deleted file mode 100644 index d2e6e313..00000000 --- a/modules/Blog/Article/Listeners/LogNewComment.php +++ /dev/null @@ -1,40 +0,0 @@ -comment->user_id) { - return; - } - - $parameters = [ - 'author' => $event->comment->name, - 'email' => $event->comment->email, - 'content' => $event->comment->content - ]; - - $this->saveLog($parameters); - } - - /** - * Getter for action name. Used only internally - * - * @return mixed - */ - protected function getName() - { - return 'commentCreated'; - } -} \ No newline at end of file diff --git a/modules/Blog/Article/Modificators/PerexCreator.php b/modules/Blog/Article/Modificators/PerexCreator.php deleted file mode 100644 index ad76b0be..00000000 --- a/modules/Blog/Article/Modificators/PerexCreator.php +++ /dev/null @@ -1,60 +0,0 @@ -DOMDocument = new \DOMDocument('1.0', 'UTF-8'); - $this->maxLength = 300; - $this->maxImages = 2; - $this->perex = ''; - } - - private function addHtml($node) - { - $this->perex .= strip_tags($this->DOMDocument->saveHTML($node), '

    '); - } - - public function create($html) - { - if (empty($html)) { - return null; - } - - $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'); - $this->DOMDocument->loadHTML($html); - - $texts = $this->DOMDocument->getElementsByTagName('p'); - $images = $this->DOMDocument->getElementsByTagName('img'); - $iframes = $this->DOMDocument->getElementsByTagName('iframe'); - - $textId = 0; - $imgId = 0; - if ($texts->length > 1) { - $this->addHtml($texts[$textId++]); - } - - if (mb_strlen($this->perex) < $this->maxLength) { - if ($iframes->length > 0) { - $this->perex .= $this->DOMDocument->saveHTML($iframes[0]); - } elseif ($images->length > 0) { - while ($imgId < $images->length && $imgId < $this->maxImages) { - $this->perex .= $this->DOMDocument->saveHTML($images[$imgId++]); - } - } else { - while (mb_strlen($this->perex) < $this->maxLength && $textId < $texts->length) { - $this->addHtml($texts[$textId++]); - } - } - } - - return $this->perex; - } -} \ No newline at end of file diff --git a/modules/Blog/Article/Pipeline/DisplayContent/LoadCommentsForBlogpost.php b/modules/Blog/Article/Pipeline/DisplayContent/LoadCommentsForBlogpost.php deleted file mode 100644 index 575f9249..00000000 --- a/modules/Blog/Article/Pipeline/DisplayContent/LoadCommentsForBlogpost.php +++ /dev/null @@ -1,33 +0,0 @@ -moduleHandler != Article::class) - return; - - $content->comments = new Collection(); - if (isset($content->moduleSettings['allowComments']) && $content->moduleSettings['allowComments']) { - $content->comments = Comment::where('content_id', $content->id) - ->with('author') - ->where('approved', 1) - ->orderBy('created_at') - ->get(); - } - } -} \ No newline at end of file diff --git a/modules/Blog/Article/Pipeline/SaveContent/TurnCommentsOnOrOff.php b/modules/Blog/Article/Pipeline/SaveContent/TurnCommentsOnOrOff.php deleted file mode 100644 index f52e4bc1..00000000 --- a/modules/Blog/Article/Pipeline/SaveContent/TurnCommentsOnOrOff.php +++ /dev/null @@ -1,29 +0,0 @@ -moduleHandler, '\\') !== Article::class) { - return; - } - - $settings = $content->moduleSettings; - $settings['allowComments'] = isset($input['allowComments']) ? (int)$input['allowComments'] : 0; - $content->moduleSettings = $settings; - $content->save(); - } -} \ No newline at end of file diff --git a/modules/Blog/Article/Providers/ArticleEventServiceProvider.php b/modules/Blog/Article/Providers/ArticleEventServiceProvider.php deleted file mode 100644 index 1004bfd3..00000000 --- a/modules/Blog/Article/Providers/ArticleEventServiceProvider.php +++ /dev/null @@ -1,36 +0,0 @@ - [LogCommentApproval::class], - DeletedComment::class => [LogDeletedComment::class], - CreatedComment::class => [LogNewComment::class], - ]; - - public function boot(DispatcherContract $events) - { - parent::boot($events); - } - - protected function setModulePath() - { - $this->path = __DIR__; - } -} \ No newline at end of file diff --git a/modules/Blog/Article/Providers/ArticleServiceProvider.php b/modules/Blog/Article/Providers/ArticleServiceProvider.php deleted file mode 100644 index bae25fe8..00000000 --- a/modules/Blog/Article/Providers/ArticleServiceProvider.php +++ /dev/null @@ -1,35 +0,0 @@ -app->register(ArticleEventServiceProvider::class); - - // load comments for blogpost - app('displayPipeline')->add(LoadCommentsForBlogpost::class); - - app('saveContentPipeline')->add(TurnCommentsOnOrOff::class); - } - - protected function setModuleAlias() - { - $this->alias = 'article'; - } - - protected function setModulePath() - { - $this->path = __DIR__; - } -} diff --git a/modules/Blog/Article/Resources/lang/cs/article.php b/modules/Blog/Article/Resources/lang/cs/article.php deleted file mode 100644 index fd1c65c6..00000000 --- a/modules/Blog/Article/Resources/lang/cs/article.php +++ /dev/null @@ -1,6 +0,0 @@ - "Povolit komentáře?", -"new" => "Napsat", -"overview" => "Všechny články", -]; diff --git a/modules/Blog/Article/Resources/lang/cs/comments.php b/modules/Blog/Article/Resources/lang/cs/comments.php deleted file mode 100644 index fa9aca67..00000000 --- a/modules/Blog/Article/Resources/lang/cs/comments.php +++ /dev/null @@ -1,22 +0,0 @@ - "Schválit komentář a zobrazovat ho u článku", - "approved" => "Komentář úspěšně schválen", - "commentedArticle" => "Komentovaný článek", - "createdAt" => "Vloženo :date", - "deleted" => "Komentář smazán", - "events" => [ - "descriptions" => [ - "commentApproved" => "Schválen komentář od autora :authro (:email) s následujícím obsahem: :content", - "commentCreated" => "Přidán komentář od autora :author (e-mail :e-mail) s následujícím obsahem: :content", - "commentDeleted" => "Smazán komentář od autora :author (:email) s následujícím obsahem: :content", - ], - "names" => [ - "commentApproved" => "Komentář schválen", - "commentCreated" => "Komentář úspěšně přidán.", - "commentDeleted" => "Smazán komentář", - ], - ], - "noComments" => "Nejsou dostupné žádné komentáře", - "unknownArticle" => "Neznámý článek", -]; diff --git a/modules/Blog/Article/Resources/lang/cs/module.php b/modules/Blog/Article/Resources/lang/cs/module.php deleted file mode 100644 index 22653cac..00000000 --- a/modules/Blog/Article/Resources/lang/cs/module.php +++ /dev/null @@ -1,12 +0,0 @@ - "Všechny články", - "blog" => "Blog", - "comments" => "Komentáře", - "commentsOverview" => "Všechny komentáře", - "description" => "Základní submodul pro blog. Tento modul umožňuje psát články.", - "editArticle" => "Upravuji článek", - "name" => "Články", - "newArticle" => "Napsat nový článek", - "templatePath" => "Články", -]; diff --git a/modules/Blog/Article/Resources/lang/en/article.php b/modules/Blog/Article/Resources/lang/en/article.php deleted file mode 100644 index 2d1e8b44..00000000 --- a/modules/Blog/Article/Resources/lang/en/article.php +++ /dev/null @@ -1,6 +0,0 @@ - 'Allow comments?', - 'new' => 'Write new', - 'overview' => 'All articles' -]; \ No newline at end of file diff --git a/modules/Blog/Article/Resources/lang/en/comments.php b/modules/Blog/Article/Resources/lang/en/comments.php deleted file mode 100644 index de5e7301..00000000 --- a/modules/Blog/Article/Resources/lang/en/comments.php +++ /dev/null @@ -1,22 +0,0 @@ - 'Created at :date', - 'commentedArticle' => 'Article', - 'approve' => 'Approve comment', - 'approved' => 'Comment successfully approved', - 'deleted' => 'Comment deleted', - 'unknownArticle' => 'Unknown article', - 'noComments' => 'No comments available', - 'events' => [ - 'names' => [ - 'commentCreated' => 'Added comment', - 'commentApproved' => 'Approved comment', - 'commentDeleted' => 'Deleted comment', - ], - 'descriptions' => [ - 'commentCreated' => 'Added comment from author :author with e-mail :email and following content: :content', - 'commentApproved' => 'Approved comment from author :author with e-mail :email and following content: :content', - 'commentDeleted' => 'Deleted comment from author :author with e-mail :email and following content: :content', - ], - ] -]; \ No newline at end of file diff --git a/modules/Blog/Article/Resources/lang/en/module.php b/modules/Blog/Article/Resources/lang/en/module.php deleted file mode 100644 index 1e272945..00000000 --- a/modules/Blog/Article/Resources/lang/en/module.php +++ /dev/null @@ -1,12 +0,0 @@ - 'Articles', - 'description' => 'Base submodule for blog', - 'comments' => 'Comments', - 'commentsOverview' => 'All comments', - 'blog' => 'Blog', - 'allArticles' => 'All articles', - 'newArticle' => 'Write new article', - 'editArticle' => 'Editing article', - 'templatePath' => 'Articles', -]; \ No newline at end of file diff --git a/modules/Blog/Article/Resources/lang/sk/article.php b/modules/Blog/Article/Resources/lang/sk/article.php deleted file mode 100644 index 2a3ce3a6..00000000 --- a/modules/Blog/Article/Resources/lang/sk/article.php +++ /dev/null @@ -1,6 +0,0 @@ - "Povoliť komentáre?", - "new" => " Napísať nový", - "overview" => "Všetky články", -]; diff --git a/modules/Blog/Article/Resources/lang/sk/comments.php b/modules/Blog/Article/Resources/lang/sk/comments.php deleted file mode 100644 index 5bde58a3..00000000 --- a/modules/Blog/Article/Resources/lang/sk/comments.php +++ /dev/null @@ -1,8 +0,0 @@ - "Schváliť komentár", - "approved" => "Komentár úspešne schválený.", - "commentedArticle" => "Článok", - "createdAt" => "Vytvorené: :date", - "deleted" => "Komentár zmazaný.", -]; diff --git a/modules/Blog/Article/Resources/lang/sk/module.php b/modules/Blog/Article/Resources/lang/sk/module.php deleted file mode 100644 index 04b574c0..00000000 --- a/modules/Blog/Article/Resources/lang/sk/module.php +++ /dev/null @@ -1,9 +0,0 @@ - "Všetky články", - "blog" => "Blog", - "comments" => "Komentáre", - "commentsOverview" => "Všetky komentáre", - "description" => "Základný submodul pre blog", - "name" => "Články", -]; diff --git a/modules/Blog/Article/Resources/views/admin/comments/overview.blade.php b/modules/Blog/Article/Resources/views/admin/comments/overview.blade.php deleted file mode 100644 index adccff8f..00000000 --- a/modules/Blog/Article/Resources/views/admin/comments/overview.blade.php +++ /dev/null @@ -1,56 +0,0 @@ -@extends('admin.layoutWithNavigation') - -@section('pageHeading', trans('article::module.comments')) - -@section('content') - @if (count($comments)) - @foreach($comments as $comment) - -

    -
    -
    -

    - - {{$comment->name}} ({{$comment->email}}) -

    -
    -
    -
    -

    - {{$comment->content}} -

    -
    - -
    - @endforeach - @else -
    - @lang('article::comments.noComments') -
    - @endif -@endsection \ No newline at end of file diff --git a/modules/Blog/Article/Resources/views/admin/content/basicInfo.blade.php b/modules/Blog/Article/Resources/views/admin/content/basicInfo.blade.php deleted file mode 100644 index dd808110..00000000 --- a/modules/Blog/Article/Resources/views/admin/content/basicInfo.blade.php +++ /dev/null @@ -1,89 +0,0 @@ -
    -
    - - - @include('admin.snippets.hasError', ['field' => 'title']) -
    -
    - - - - @include('admin.snippets.hasError', ['field' => 'url']) -
    -
    - -
    -
    - -
    -
    - - - @include('admin.snippets.hasError', ['field' => 'status']) -
    -
    - - - @include('admin.snippets.hasError', ['field' => 'parentPage']) -
    - -
    - -
    - - @if($module->support_categories && count($categories)) -
    - -
    - @endif -
    - -
    -
    - -
    -
    - - - - - diff --git a/modules/Blog/Article/start.php b/modules/Blog/Article/start.php deleted file mode 100644 index 7d8ae759..00000000 --- a/modules/Blog/Article/start.php +++ /dev/null @@ -1,15 +0,0 @@ - 'Article list', - 'translatedName' => 'articlelist::module.name', - 'translatedDescription' => 'articlelist::module.description', - 'alias' => 'articlelist', - 'handler' => \Modules\Blog\ArticleList\Handlers\ArticleList::class, - 'providers' => [\Modules\Blog\ArticleList\Providers\ArticleListServiceProvider::class], - 'files' => ['start.php'], - 'order' => 0, -]; \ No newline at end of file diff --git a/modules/Blog/ArticleList/Handlers/ArticleList.php b/modules/Blog/ArticleList/Handlers/ArticleList.php deleted file mode 100644 index 2f67d703..00000000 --- a/modules/Blog/ArticleList/Handlers/ArticleList.php +++ /dev/null @@ -1,28 +0,0 @@ -whereTitle(trans('article::module.blog')); - if (!$blogSubmenu) { - $blogSubmenu = $menu->dropdown(trans('article::module.blog'), function ($sub) { - }, 20, ['icon' => 'fa fa-fw fa-book']); - } - - $blogSubmenu->route('content.new', trans('articlelist::module.name'), ['id' => config('articlelist.alias')], 100, ['icon' => 'fa fa-fw fa-list-alt']); - } - - public static function supportCategories() - { - return false; - } -} \ No newline at end of file diff --git a/modules/Blog/ArticleList/Http/Controllers/.gitkeep b/modules/Blog/ArticleList/Http/Controllers/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/modules/Blog/ArticleList/Http/Controllers/ArticleListController.php b/modules/Blog/ArticleList/Http/Controllers/ArticleListController.php deleted file mode 100644 index df742323..00000000 --- a/modules/Blog/ArticleList/Http/Controllers/ArticleListController.php +++ /dev/null @@ -1,12 +0,0 @@ -moduleHandler != ArticleList::class) - return; - - $articles = ArticleModel::where('moduleHandler', Article::class) - ->with('comments') - ->with('category') - ->where(function ($query) { - $query->where('publishedFrom', '<', Carbon::now()) - ->orWhereNull('publishedFrom'); - }) - ->where(function ($query) { - $query->where('publishedTo', '>', Carbon::now()) - ->orWhereNull('publishedTo'); - }) - ->orderBy('publishedFrom', 'DESC') - ->orderBy('created_at', 'DESC'); - - // show articles for not-logged users of even for logged onew? - $articles = !Auth::user() ? $articles->where('status', IContent::STATUS_PUBLIC) : $articles->whereIn('status', [ - IContent::STATUS_PUBLIC, - IContent::STATUS_PROTECTED - ]); - - // selected articles from archive? - $this->archive($articles); - - // is given any category? - $this->category($articles); - - // show articles only from specified user - $author = Input::get('author'); - if ($author) { - $user = User::findOrFail($author); - - $articles = $articles->where('user_id', $user->id); - } - - $page->articles = $articles->paginate(setting('articlesPerPage', 20)); - } - - /** - * Filter articles on article list using archive - * - * @param $articles - */ - protected function archive(&$articles) - { - $year = Input::get('y'); - $month = Input::get('m'); - $day = Input::get('d'); - - if ($year) { - $articles = $articles->where(DB::raw('YEAR(created_at)'), $year); - } - - if ($month) { - $articles = $articles->where(DB::raw('MONTH(created_at)'), $month); - } - - if ($day) { - $articles = $articles->where(DB::raw('DAY(created_at)'), $day); - } - } - - /** - * Filter article list to some specified category - * - * Category URL is specified as GET attribute "category" - * - * @param $articles - */ - protected function category(&$articles) - { - $categoryUrl = Input::get('category'); - - $categoriesEnabled = \Module::get('Categories') - ->enabled(); - - if ($categoryUrl && $categoriesEnabled) { - $category = Category::where('url', $categoryUrl) - ->firstOrFail(); - - $subcategories = $category->getChildren() - ->toArray(); - - $categories = [$category->id]; - $categories = array_merge($categories, array_map(function ($cat) { - return $cat['id']; - }, $subcategories)); - - $articles = $articles->whereIn('category_id', $categories); - } - } -} \ No newline at end of file diff --git a/modules/Blog/ArticleList/Providers/ArticleListServiceProvider.php b/modules/Blog/ArticleList/Providers/ArticleListServiceProvider.php deleted file mode 100644 index 75fea4ae..00000000 --- a/modules/Blog/ArticleList/Providers/ArticleListServiceProvider.php +++ /dev/null @@ -1,24 +0,0 @@ -alias = 'articlelist'; - } - - protected function setModulePath() - { - $this->path = __DIR__; - } - - public function boot() - { - parent::boot(); - - app('displayPipeline')->add(LoadArticlesForList::class); - } -} diff --git a/modules/Blog/ArticleList/Resources/lang/cs/module.php b/modules/Blog/ArticleList/Resources/lang/cs/module.php deleted file mode 100644 index 09d24c67..00000000 --- a/modules/Blog/ArticleList/Resources/lang/cs/module.php +++ /dev/null @@ -1,6 +0,0 @@ - "Modul pro zobrazování seznamu článků na webu.", - "name" => "Seznam článků", - "templatePath" => "Seznam článků", -]; diff --git a/modules/Blog/ArticleList/Resources/lang/en/module.php b/modules/Blog/ArticleList/Resources/lang/en/module.php deleted file mode 100644 index 98b22ac7..00000000 --- a/modules/Blog/ArticleList/Resources/lang/en/module.php +++ /dev/null @@ -1,6 +0,0 @@ - 'Article list', - 'description' => 'Module for displaying list of articles on web', - 'templatePath' => 'Article list', -]; \ No newline at end of file diff --git a/modules/Blog/ArticleList/Resources/lang/sk/module.php b/modules/Blog/ArticleList/Resources/lang/sk/module.php deleted file mode 100644 index 2e2a64c4..00000000 --- a/modules/Blog/ArticleList/Resources/lang/sk/module.php +++ /dev/null @@ -1,5 +0,0 @@ - "Modul pre zobrazenie zoznamu článkov na webe", - "name" => "Zoznam článkov", -]; diff --git a/modules/Blog/ArticleList/Resources/views/admin/.gitkeep b/modules/Blog/ArticleList/Resources/views/admin/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/modules/Blog/ArticleList/start.php b/modules/Blog/ArticleList/start.php deleted file mode 100644 index 7d8ae759..00000000 --- a/modules/Blog/ArticleList/start.php +++ /dev/null @@ -1,15 +0,0 @@ -increments('id'); - $table->timestamps(); - $table->integer('user_id') - ->nullable(true) - ->default(null) - ->comment('When comment was inserted by logged user, save his ID here'); - $table->integer('content_id'); - $table->string('email'); - $table->string('name'); - $table->text('content'); - $table->boolean('approved'); - - $table->foreign('content_id') - ->references('id') - ->on('contents') - ->onDelete('cascade') - ->onUpdate('cascade'); - - $table->foreign('user_id') - ->references('id') - ->on('users') - ->onDelete('set null') - ->onUpdate('cascade'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('comments'); - } -} diff --git a/modules/Blog/Database/Migrations/2017_02_10_124658_update_alias_for_subdomodules.php b/modules/Blog/Database/Migrations/2017_02_10_124658_update_alias_for_subdomodules.php deleted file mode 100644 index 76970aeb..00000000 --- a/modules/Blog/Database/Migrations/2017_02_10_124658_update_alias_for_subdomodules.php +++ /dev/null @@ -1,34 +0,0 @@ -update(['alias' => 'articlelist']); - Module::where('alias', 'blog-article') - ->update(['alias' => 'article']); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Module::where('alias', 'articlelist') - ->update(['alias' => 'blog-articlelist']); - Module::where('alias', 'article') - ->update(['alias' => 'blog-article']); - } -} diff --git a/modules/Blog/info.php b/modules/Blog/info.php deleted file mode 100644 index 0c426fe5..00000000 --- a/modules/Blog/info.php +++ /dev/null @@ -1,7 +0,0 @@ - 'Blog', - 'translatedName' => 'article::module.blog', - 'description' => 'article.module.blogDescription', - 'hasSubmodules' => true, -]; \ No newline at end of file diff --git a/modules/Categories/Config/config.php b/modules/Categories/Config/config.php deleted file mode 100644 index 5b050b72..00000000 --- a/modules/Categories/Config/config.php +++ /dev/null @@ -1,12 +0,0 @@ - 'Categories', - 'translatedName' => 'categories::module.name', - 'translatedDescription' => 'categories::module.description', - 'alias' => 'categories', - 'handler' => \Modules\Categories\Handlers\Categories::class, - 'providers' => [\Modules\Categories\Providers\CategoriesServiceProvider::class], - 'files' => ['start.php'], - 'order' => 0, -]; \ No newline at end of file diff --git a/modules/Categories/Contracts/Repositories/Category.php b/modules/Categories/Contracts/Repositories/Category.php deleted file mode 100644 index ea344d3d..00000000 --- a/modules/Categories/Contracts/Repositories/Category.php +++ /dev/null @@ -1,9 +0,0 @@ -increments('id'); - $table->timestamps(); - $table->softDeletes(); - $table->integer('parent_id') - ->unsigned() - ->nullable(); - $table->integer('position', false, true); - $table->integer('real_depth', false, true); - $table->integer('user_id') - ->comment('Author of this category'); - $table->integer('module_id') - ->comment('ID of module, where this category is used'); - $table->string('name') - ->comment('Human readable name of category'); - $table->string('url') - ->index() - ->comment('URL slug of category'); - $table->text('description'); - - $table->unique(['url', 'module_id']); - }); - - Schema::table('categories', function (Blueprint $table) { - $table->foreign('parent_id') - ->references('id') - ->on('categories') - ->onDelete('set null'); - - $table->foreign('user_id') - ->references('id') - ->on('users') - ->onDelete('cascade') - ->onUpdate('cascade'); - - $table->foreign('module_id') - ->references('id') - ->on('modules') - ->onDelete('cascade') - ->onUpdate('cascade'); - }); - } - - public function down() - { - Schema::table('categories', function (Blueprint $table) { - Schema::dropIfExists('categories'); - }); - } -} diff --git a/modules/Categories/Database/Migrations/2016_08_10_204046_create_category_closures_table.php b/modules/Categories/Database/Migrations/2016_08_10_204046_create_category_closures_table.php deleted file mode 100644 index d580f81a..00000000 --- a/modules/Categories/Database/Migrations/2016_08_10_204046_create_category_closures_table.php +++ /dev/null @@ -1,35 +0,0 @@ -increments('closure_id'); - - $table->integer('ancestor', false, true); - $table->integer('descendant', false, true); - $table->integer('depth', false, true); - - $table->foreign('ancestor') - ->references('id') - ->on('categories') - ->onDelete('cascade'); - $table->foreign('descendant') - ->references('id') - ->on('categories') - ->onDelete('cascade'); - }); - } - - public function down() - { - Schema::table('category_closure', function (Blueprint $table) { - Schema::dropIfExists('category_closure'); - }); - } -} diff --git a/modules/Categories/Database/Seeders/.gitkeep b/modules/Categories/Database/Seeders/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/modules/Categories/Database/Seeders/CategoriesDatabaseSeeder.php b/modules/Categories/Database/Seeders/CategoriesDatabaseSeeder.php deleted file mode 100644 index 5a509fba..00000000 --- a/modules/Categories/Database/Seeders/CategoriesDatabaseSeeder.php +++ /dev/null @@ -1,20 +0,0 @@ -call("OthersTableSeeder"); - } - -} \ No newline at end of file diff --git a/modules/Categories/Entities/Category.php b/modules/Categories/Entities/Category.php deleted file mode 100644 index f1147b26..00000000 --- a/modules/Categories/Entities/Category.php +++ /dev/null @@ -1,33 +0,0 @@ -belongsTo(Module::class); - } - - public function content() - { - return $this->hasMany(Content::class, 'categoryId'); - } -} diff --git a/modules/Categories/Entities/CategoryClosure.php b/modules/Categories/Entities/CategoryClosure.php deleted file mode 100644 index bdb3a035..00000000 --- a/modules/Categories/Entities/CategoryClosure.php +++ /dev/null @@ -1,14 +0,0 @@ -dropdown(trans('categories::categories.name'), function ($sub) { - $sub->route('categories.new', trans('categories::categories.new'), [], 10, ['icon' => 'fa fa-fw fa-plus']); - $sub->route('categories.overview', trans('categories::categories.overview'), [], 30, ['icon' => 'fa fa-fw fa-tags']); - }, 55, ['icon' => 'fa fa-fw fa-tags']); - } -} \ No newline at end of file diff --git a/modules/Categories/Http/Controllers/CategoriesOverview.php b/modules/Categories/Http/Controllers/CategoriesOverview.php deleted file mode 100644 index 741754a8..00000000 --- a/modules/Categories/Http/Controllers/CategoriesOverview.php +++ /dev/null @@ -1,23 +0,0 @@ -toArray(); - - $modules = ModuleNamesWithIds::getWithTranslations(); - - return view('categories::admin.overview', [ - 'categories' => $categories, - 'modules' => $modules - ]); - } -} \ No newline at end of file diff --git a/modules/Categories/Http/Controllers/CreateNewCategory.php b/modules/Categories/Http/Controllers/CreateNewCategory.php deleted file mode 100644 index 129f0ec9..00000000 --- a/modules/Categories/Http/Controllers/CreateNewCategory.php +++ /dev/null @@ -1,61 +0,0 @@ -toArray(); - - // get list of modules which supports categories - $modules = Module::where('enabled', true) - ->where('support_categories', true) - ->get(); - - return view('categories::admin.new', [ - 'category' => new Category(), - 'categories' => $categories, - 'modules' => $modules - ]); - } - - /** - * Create new category - * - * @param Request $request - * - * @return \Illuminate\Http\RedirectResponse - */ - public function postNew(Request $request) - { - $category = new Category(); - $category->user_id = Auth::user()->id; - $category->module_id = $request->moduleId; - $category->name = $request->name; - $category->url = Str::slug($request->url); - $category->description = $request->description; - - if ((int)$request->parentCategory) { - $category->parent_id = $request->parentCategory; - } - - $category->save(); - - return redirect() - ->route('categories.overview') - ->with('success', trans('categories::categories.saveSuccessfull')); - } -} \ No newline at end of file diff --git a/modules/Categories/Http/Controllers/EditCategory.php b/modules/Categories/Http/Controllers/EditCategory.php deleted file mode 100644 index 4ff13b35..00000000 --- a/modules/Categories/Http/Controllers/EditCategory.php +++ /dev/null @@ -1,77 +0,0 @@ -toArray(); - - // get list of modules which supports categories - $modules = Module::where('enabled', true) - ->where('support_categories', true) - ->get(); - - return view('categories::admin.edit', [ - 'category' => $category, - 'categories' => $categories, - 'modules' => $modules - ]); - } - - /** - * Create new category - * - * @param Request $request - * @param $id - * - * @return \Illuminate\Http\RedirectResponse - */ - public function postEdit(Request $request, $id) - { - $category = Category::findOrFail($id); - - $category->name = $request->name; - $category->url = Str::slug($request->url); - $category->description = $request->description; - - $category->save(); - - if ($category->parent_id !== $request->parentCategory) { - $category->parent_id = empty($request->parentCategory) ? null : $request->parentCategory; - $category->save(); - - if (empty($request->parentCategory)) { - $category->makeRoot($category->position); - } - } - - return redirect() - ->route('categories.edit', ['id' => $id]) - ->with('success', trans('categories::categories.saveSuccessfull')); - } - - public function delete($id) { - $category = Category::findOrFail($id); - - $category->delete(); - - return redirect() - ->route('categories.overview') - ->with('success', trans('categories::categories.deleteSuccessfull')); - } -} \ No newline at end of file diff --git a/modules/Categories/Http/Middleware/.gitkeep b/modules/Categories/Http/Middleware/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/modules/Categories/Http/Requests/.gitkeep b/modules/Categories/Http/Requests/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/modules/Categories/Http/routes.php b/modules/Categories/Http/routes.php deleted file mode 100644 index 52ff9a1a..00000000 --- a/modules/Categories/Http/routes.php +++ /dev/null @@ -1,23 +0,0 @@ - LaravelLocalization::setLocale() . '/admin/categories', - 'middleware' => ['admin'], - 'namespace' => 'Modules\Categories\Http\Controllers' - ], function () { - Route::get('/', 'CategoriesOverview@getOverview') - ->name('categories.overview'); - - Route::get('/new', 'CreateNewCategory@getNew') - ->name('categories.new'); - Route::post('/new', 'CreateNewCategory@postNew') - ->name('categories.postNew'); - - Route::get('/edit/{id}', 'EditCategory@getEdit') - ->name('categories.edit'); - Route::post('/edit/{id}', 'EditCategory@postEdit') - ->name('categories.postEdit'); - - Route::get('/delete/{id}', 'EditCategory@delete') - ->name('categories.delete'); -}); \ No newline at end of file diff --git a/modules/Categories/Providers/CategoriesServiceProvider.php b/modules/Categories/Providers/CategoriesServiceProvider.php deleted file mode 100644 index 970fcc57..00000000 --- a/modules/Categories/Providers/CategoriesServiceProvider.php +++ /dev/null @@ -1,26 +0,0 @@ -alias = 'categories'; - } - - public function boot() - { - parent::boot(); - - $this->app->bind(ICategory::class, Category::class); - } - - protected function setModulePath() - { - $this->path = __DIR__; - } -} diff --git a/modules/Categories/Repositories/Category.php b/modules/Categories/Repositories/Category.php deleted file mode 100644 index d7c2a452..00000000 --- a/modules/Categories/Repositories/Category.php +++ /dev/null @@ -1,22 +0,0 @@ -support_categories && !is_null($categoryModule) && $categoryModule->enabled()) { - $categories = CategoryModel::where('module_id', $module->id) - ->get(); - } - - return $categories; - } -} \ No newline at end of file diff --git a/modules/Categories/Resources/lang/cs/categories.php b/modules/Categories/Resources/lang/cs/categories.php deleted file mode 100644 index 70faf2ea..00000000 --- a/modules/Categories/Resources/lang/cs/categories.php +++ /dev/null @@ -1,20 +0,0 @@ - "Akce", -"deleteSuccessfull" => "Kategorie úspěšně smazána", -"description" => "Modul pro správu a kategorizaci obsahu.", -"edit" => "Úprava kategorie", -"fields" => ["description" => "Popis", -"module" => "Modul", -"name" => "Jméno", -"parentCategory" => "Rodičovská kategorie", -"save" => "Uložit", -"url" => "URL", -], -"module" => "Modul", -"name" => "Kategorie", -"new" => "Nová kategorie", -"noCategories" => "Žádná vytvořená kategorie.", -"overview" => "Všechny kategorie", -"saveSuccessfull" => "Kategorie úspěšně uložena", -]; diff --git a/modules/Categories/Resources/lang/en/categories.php b/modules/Categories/Resources/lang/en/categories.php deleted file mode 100644 index a01d847e..00000000 --- a/modules/Categories/Resources/lang/en/categories.php +++ /dev/null @@ -1,21 +0,0 @@ - 'Categories', - 'description' => 'Module for category management and content categorization.', - 'new' => 'New category', - 'overview' => 'All categories', - 'fields' => [ - 'name' => 'Name', - 'description' => 'Description', - 'url' => 'URL', - 'module' => 'Module', - 'parentCategory' => 'Parent category', - 'save' => 'Save category' - ], - 'edit' => 'Edit category', - 'saveSuccessfull' => 'Category successfully saved', - 'deleteSuccessfull' => 'Category successfully deleted', - 'module' => 'Module', - 'actions' => 'Actions', - 'noCategories' => 'No categories available' -]; \ No newline at end of file diff --git a/modules/Categories/Resources/lang/sk/categories.php b/modules/Categories/Resources/lang/sk/categories.php deleted file mode 100644 index ceb9a5dd..00000000 --- a/modules/Categories/Resources/lang/sk/categories.php +++ /dev/null @@ -1,20 +0,0 @@ - "Akcie", - "deleteSuccessfull" => "Kategória úspešne zmazaná.", - "description" => "Modul pre správu kategórií a kategorizovanie obsahu", - "edit" => "Upraviť kategóriu", - "fields" => ["description" => "Popis", - "module" => "Modul", - "name" => "Názov", - "parentCategory" => "Rodičovská kategória", - "save" => "Uložiť kategóriu", - "url" => "URL", - ], - "module" => "Modul", - "name" => "Kategórie", - "new" => "Nová kategória", - "noCategories" => "Žiadne kategórie nie sú dostupné.", - "overview" => "Všetky kategórie", - "saveSuccessfull" => "Kategória úspešne uložená.", -]; diff --git a/modules/Categories/Resources/views/admin/edit.blade.php b/modules/Categories/Resources/views/admin/edit.blade.php deleted file mode 100644 index 9f2c69a6..00000000 --- a/modules/Categories/Resources/views/admin/edit.blade.php +++ /dev/null @@ -1,7 +0,0 @@ -@extends('admin.layoutWithNavigation') - -@section('pageHeading', trans('categories::categories.edit')) - -@section('content') - @include('categories::admin.form', ['action' => route('categories.postEdit', ['id' => $category->id])]) -@endsection \ No newline at end of file diff --git a/modules/Categories/Resources/views/admin/form.blade.php b/modules/Categories/Resources/views/admin/form.blade.php deleted file mode 100644 index 9e744f23..00000000 --- a/modules/Categories/Resources/views/admin/form.blade.php +++ /dev/null @@ -1,67 +0,0 @@ -
    - {!! csrf_field() !!} -
    -
    - - - -
    -
    - - - - -
    -
    -
    - -
    -
    -
    - - - - - -
    -
    - - - -
    -
    - @if(count($categories)) - - - - @endif -
    -
    - - -
    \ No newline at end of file diff --git a/modules/Categories/Resources/views/admin/new.blade.php b/modules/Categories/Resources/views/admin/new.blade.php deleted file mode 100644 index 12cae2af..00000000 --- a/modules/Categories/Resources/views/admin/new.blade.php +++ /dev/null @@ -1,7 +0,0 @@ -@extends('admin.layoutWithNavigation') - -@section('pageHeading', trans('categories::categories.new')) - -@section('content') - @include('categories::admin.form', ['action' => route('categories.postNew')]) -@endsection \ No newline at end of file diff --git a/modules/Categories/Resources/views/admin/overview.blade.php b/modules/Categories/Resources/views/admin/overview.blade.php deleted file mode 100644 index 0114b128..00000000 --- a/modules/Categories/Resources/views/admin/overview.blade.php +++ /dev/null @@ -1,26 +0,0 @@ -@extends('admin.layoutWithNavigation') - -@section('pageHeading', trans('categories::categories.overview')) - -@section('content') - @if(count($categories)) - - - - - - - - - - @foreach($categories as $category) - @include('categories::admin.snippets.overviewRow', ['level' => 0, 'currentCategory' => $category]) - @endforeach - -
    @lang('categories::categories.name')@lang('categories::categories.module')@lang('categories::categories.actions')
    - @else -
    - @lang('categories::categories.noCategories') -
    - @endif -@stop \ No newline at end of file diff --git a/modules/Categories/Resources/views/admin/snippets/optionParentCategories.blade.php b/modules/Categories/Resources/views/admin/snippets/optionParentCategories.blade.php deleted file mode 100644 index aee0f619..00000000 --- a/modules/Categories/Resources/views/admin/snippets/optionParentCategories.blade.php +++ /dev/null @@ -1,9 +0,0 @@ - - -@if(isset($currentCategory['children'])) - @foreach($currentCategory['children'] as $category) - @include('categories::admin.snippets.optionParentCategories', ['selectedCategory' => $selectedCategory, 'currentCategory' => $category, 'level' => $level+1]) - @endforeach -@endif \ No newline at end of file diff --git a/modules/Categories/Resources/views/admin/snippets/overviewRow.blade.php b/modules/Categories/Resources/views/admin/snippets/overviewRow.blade.php deleted file mode 100644 index 13c15e65..00000000 --- a/modules/Categories/Resources/views/admin/snippets/overviewRow.blade.php +++ /dev/null @@ -1,17 +0,0 @@ - - - {{str_repeat('-', $level)}} {{$currentCategory['name']}} - - @lang($modules[$currentCategory['module_id']]) - - - - - - - -@if(isset($currentCategory['children'])) - @foreach($currentCategory['children'] as $category) - @include('categories::admin.snippets.overviewRow', ['currentCategory' => $category, 'level' => $level+1]) - @endforeach -@endif \ No newline at end of file diff --git a/modules/Categories/composer.json b/modules/Categories/composer.json deleted file mode 100644 index 660f3a21..00000000 --- a/modules/Categories/composer.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "pingpong-modules/categories", - "description": "", - "authors": [ - { - "name": "Pingpong Labs", - "email": "pingpong.labs@gmail.com" - } - ], - "autoload": { - "psr-4": { - "Modules\\Categories\\": "" - } - } -} \ No newline at end of file diff --git a/modules/Categories/start.php b/modules/Categories/start.php deleted file mode 100644 index 7d8ae759..00000000 --- a/modules/Categories/start.php +++ /dev/null @@ -1,15 +0,0 @@ - 'ContactForm', - 'translatedName' => 'contactform::module.name', - 'translatedDescription' => 'contactform::module.description', - 'alias' => 'contactform', - 'handler' => '\\Modules\\ContactForm\\Handlers\\ContactForm', - 'providers' => [\Modules\ContactForm\Providers\ContactFormServiceProvider::class], - 'files' => ['start.php'], - 'order' => 0, -]; \ No newline at end of file diff --git a/modules/ContactForm/Handlers/ContactForm.php b/modules/ContactForm/Handlers/ContactForm.php deleted file mode 100644 index 6763d513..00000000 --- a/modules/ContactForm/Handlers/ContactForm.php +++ /dev/null @@ -1,152 +0,0 @@ -. View is returned only as name in plain text - * - * @return array of views/templates/html codes divided into section - */ - public static function getExtendedFormInputsCreate() - { - return [ - 'basicInfo' => 'contactform::admin.form.basicInfo', - 'content' => 'contactform::admin.form.content', - 'meta' => 'admin.content.formParts.metaInformation', - 'appearance' => 'admin.content.formParts.appearance', - 'publication' => 'admin.content.formParts.publicationSetup', - 'files' => 'admin.content.formParts.files', - ]; - } - - public static function getExtendedFormInputsEdit() - { - return self::getExtendedFormInputsCreate(); - } - - /** - * Register admin menu (or multiple ones) - * - * This cannot be in ServiceProvider because Session is started at middleware. And ServiceProvider is called before - * starting any middleware.. - * - * @param User $user model of logged user - */ - public static function registerAdminMenu(User $user) - { - // register links in admin menu - $menu = \Menu::instance('mainMenu'); - - $submenu = $menu->whereTitle(trans('admin/mainMenu.contentPages')); - $submenu->dropdown(trans('contactform::admin/adminMenu.contactForm'), function ($submenu) use ($user) { - $submenu->route('content.new', trans('contactform::admin/adminMenu.new'), ['moduleId' => self::getModuleId()], 10, ['icon' => 'fa fa-plus']); - $submenu->route('content.overview', trans('contactform::admin/adminMenu.overview'), ['moduleId' => self::getModuleId()], 20, ['icon' => 'fa fa-list']); - // $submenu->route('emails.sent', trans('contactform::admin/adminMenu.sentMessages'), [], 30, ['icon' => 'fa fa-send']); - }, 25, ['icon' => 'fa fa-envelope-o']); - } - - /** - * Does given module manage content? Or is it just module with widgets/something internal/something absolutely else? - * - * @return bool - */ - public static function managesContent() - { - return true; - } - - /** - * Get translated title for pages overview of given type. - * - * This value is used for rendering list of all content pages of given type in administration. - * - * @return string - */ - public static function getOverviewTitle() - { - return trans('contactform::module.allForms'); - } - - /** - * Title displayed above for for creating new content page - * - * @return string - */ - public static function getCreateNewTitle() - { - return trans('contactform::module.newForm'); - } - - /** - * Title for form displayed for editin content page - * - * @param Content $content - * - * @return mixed - */ - public static function getEditTitle(Content $content) - { - return trans('contactform::module.editForm'); - } - - /** - * Does this module support categories? - * - * @return boolean - */ - public static function supportCategories() - { - return true; - } - - /** - * Method called right after content page is marked as deleted - * - * This method is supposed to clean after "deleted" page. - * - * @param Content $content - * - * @return mixed - */ - public static function delete(Content $content) - { - } -} \ No newline at end of file diff --git a/modules/ContactForm/Handlers/ContactFormHistory.php b/modules/ContactForm/Handlers/ContactFormHistory.php deleted file mode 100644 index 3a1def56..00000000 --- a/modules/ContactForm/Handlers/ContactFormHistory.php +++ /dev/null @@ -1,28 +0,0 @@ -findOrFail($formId); - - // select template - $template = isset($form->moduleSettings['emailTemplate']) ? $form->moduleSettings['emailTemplate'] : 'contactform::emails.default'; - - // send email - $status = Mail::send(Template::name($template), ['data' => $request], function (Message $message) use ($request, $form) { - $message->from($request->email, $request->name); - - // get message subject - $subject = isset($form->moduleSettings['subject']) ? $form->moduleSettings['subject'] : trans('contactform::admin/contents.defaultSubject'); - - $message->to($form->moduleSettings['email']) - ->subject($subject); - }); - - // inform user about success or failure - return $this->sendResponse($status, $request, $form); - } - - private function sendResponse($status, SendNewEmailRequest $request, $form) - { - // send response for ajax - if ($request->ajax()) { - return response()->json([ - 'status' => $status ? 'success' : 'failed', - 'redirectUrl' => $form->url - ]); - } else { - // redirect user to previous form - $response = redirect()->back(); - - return $status ? $response->with('success', 'sent') : $response->with('error', 'cannotSend'); - } - } -} diff --git a/modules/ContactForm/Http/Requests/SendNewEmailRequest.php b/modules/ContactForm/Http/Requests/SendNewEmailRequest.php deleted file mode 100644 index e1a84208..00000000 --- a/modules/ContactForm/Http/Requests/SendNewEmailRequest.php +++ /dev/null @@ -1,20 +0,0 @@ - 'required', - 'email' => 'required|email', - 'message' => 'required', - ]; - } -} diff --git a/modules/ContactForm/Http/routes.php b/modules/ContactForm/Http/routes.php deleted file mode 100644 index 2ff17cff..00000000 --- a/modules/ContactForm/Http/routes.php +++ /dev/null @@ -1,12 +0,0 @@ - ['web'], - 'namespace' => '\Modules\ContactForm\Http\Controllers\Visitor', - 'prefix' => LaravelLocalization::setLocale() . '/contactform' - ], function () { - - // method for sending new message - - Route::post('/message/{formId}', 'CreateNewMessage@postMessage') - ->name('email.send'); -}); \ No newline at end of file diff --git a/modules/ContactForm/Pipeline/SavePipeline/SaveContactInformation.php b/modules/ContactForm/Pipeline/SavePipeline/SaveContactInformation.php deleted file mode 100644 index a4f74412..00000000 --- a/modules/ContactForm/Pipeline/SavePipeline/SaveContactInformation.php +++ /dev/null @@ -1,39 +0,0 @@ - - */ - function handle(Content & $page, array & $input) - { - if (trim($page->moduleHandler, '\\') != ContactForm::class) { - return; - } - - $settings = [ - 'phone' => $input['phone'], - 'email' => $input['email'], - 'contactEmail' => $input['contactEmail'], - 'subject' => $input['subject'], - 'companyName' => $input['companyName'], - 'address' => $input['address'], - 'gpsLat' => $input['gpsLat'], - 'gpsLng' => $input['gpsLng'], - ]; - - // save settings - $page->moduleSettings = $settings; - $page->save(); - } -} \ No newline at end of file diff --git a/modules/ContactForm/Providers/ContactFormServiceProvider.php b/modules/ContactForm/Providers/ContactFormServiceProvider.php deleted file mode 100644 index a04f0762..00000000 --- a/modules/ContactForm/Providers/ContactFormServiceProvider.php +++ /dev/null @@ -1,52 +0,0 @@ -registerWidgets(); - - app('saveContentPipeline')->add(SaveContactInformation::class); - } - - /** - * Register the service provider. - * - * @return void - */ - public function register() - { - $registrator = $this->app->make('registerSettingsExtension'); - $registrator->register('contactForm', 'contactform::module.name', 'contactform::admin.settings.form'); - } - - private function registerWidgets() - { - $registrator = $this->app->make('registerWidget'); - - $registrator->register(Address::class, null, ContactForm::getModuleId()); - $registrator->register(Form::class, null, ContactForm::getModuleId()); - } - - protected function setModuleAlias() - { - $this->alias = 'contactform'; - } - - protected function setModulePath() - { - $this->path = __DIR__; - } -} diff --git a/modules/ContactForm/Resources/lang/cs/admin/adminMenu.php b/modules/ContactForm/Resources/lang/cs/admin/adminMenu.php deleted file mode 100644 index 72e7b038..00000000 --- a/modules/ContactForm/Resources/lang/cs/admin/adminMenu.php +++ /dev/null @@ -1,9 +0,0 @@ - "Kontaktní formulář", -"emails" => "E-mailové šablony", -"new" => "Nový", -"overview" => "Všechny formuláře", -"sentMessages" => "Zprávy", -"templatePath" => "Kontaktní formulář", -]; diff --git a/modules/ContactForm/Resources/lang/cs/admin/content.php b/modules/ContactForm/Resources/lang/cs/admin/content.php deleted file mode 100644 index 85db12f7..00000000 --- a/modules/ContactForm/Resources/lang/cs/admin/content.php +++ /dev/null @@ -1,15 +0,0 @@ - "Adresa", -"compName" => "Jméno zobrazené nad adresou", -"contactEmail" => "E-mail, kam budou doručovány zprávy z tohoto formuláře", -"contactInformation" => "Kontaktní informace", -"content" => "Obsah kontaktního formuláře", -"defaultSubject" => "Nová zpráva z kontaktního formuláře", -"email" => "E-mail", -"emailList" => "Odesílat zprávy na tyto adresy", -"gpsLat" => "GPS šířka", -"gpsLng" => "GPS délka", -"phone" => "Kontaktní telefon", -"subject" => "Předmět zprávy", -]; diff --git a/modules/ContactForm/Resources/lang/cs/admin/history.php b/modules/ContactForm/Resources/lang/cs/admin/history.php deleted file mode 100644 index 2c6525b8..00000000 --- a/modules/ContactForm/Resources/lang/cs/admin/history.php +++ /dev/null @@ -1,11 +0,0 @@ - "Adresa", -"columnCompanyName" => "Jméno společnosti", -"columnContactEmail" => "Kontaktní e-mail", -"columnEmail" => "E-mail", -"columnGpsLat" => "GPS šířka", -"columnGpsLng" => "GPS délka", -"columnPhone" => "Telefon", -"columnSubject" => "Předmět", -]; diff --git a/modules/ContactForm/Resources/lang/cs/admin/settings.php b/modules/ContactForm/Resources/lang/cs/admin/settings.php deleted file mode 100644 index aee9fa69..00000000 --- a/modules/ContactForm/Resources/lang/cs/admin/settings.php +++ /dev/null @@ -1,5 +0,0 @@ - "Application secret kez pro reCaptcha", -"recaptchaSiteKey" => "Site key pro reCaptcha", -]; diff --git a/modules/ContactForm/Resources/lang/cs/admin/widgets.php b/modules/ContactForm/Resources/lang/cs/admin/widgets.php deleted file mode 100644 index 9c2f1d09..00000000 --- a/modules/ContactForm/Resources/lang/cs/admin/widgets.php +++ /dev/null @@ -1,16 +0,0 @@ - [ - "description" => "Malý widget určený pro zobrazení adresy, která byla uložena u vybraného kontaktního formuláře.", - "edit" => "Upravuji blok s adresou", - "name" => "Blok s adresou", - "new" => "Nový blok s adresou", - ], - "form" => [ - "description" => "Widget pro zobrazení kontaktního formuláře kdekoliv na webu - v obsahu stránky, menu, patičce, ...", - "name" => "Kontaktní formulář", - "new" => "Nový widget s kontaktním formulářem", - ], - "noContactForms" => "Vypadá to, že v systému nebyl vytvořen žádný kontaktní formulář. Z toho důvodu není možné vytvořit ani tento widget. Vytvořte nejprve nějaký kontaktní formulář a pak opakujte tento pokus.", - "selectContactForm" => "Vybrat kontaktní formulář", -]; diff --git a/modules/ContactForm/Resources/lang/cs/module.php b/modules/ContactForm/Resources/lang/cs/module.php deleted file mode 100644 index c76b9420..00000000 --- a/modules/ContactForm/Resources/lang/cs/module.php +++ /dev/null @@ -1,8 +0,0 @@ - "Všechny formuláře", -"description" => "Jednoduchý kontaktní formulář", -"editForm" => "Upravuji formulář", -"name" => "Kontaktní formulář", -"newForm" => "Vytvořit nový kontaktní formulář", -]; diff --git a/modules/ContactForm/Resources/lang/en/admin/adminMenu.php b/modules/ContactForm/Resources/lang/en/admin/adminMenu.php deleted file mode 100644 index 3e869c0f..00000000 --- a/modules/ContactForm/Resources/lang/en/admin/adminMenu.php +++ /dev/null @@ -1,9 +0,0 @@ - 'Contact form', - 'new' => 'New', - 'overview' => 'All contact forms', - 'sentMessages' => 'Messages', - 'templatePath' => 'Contact form', - 'emails' => 'E-mail templates', -]; \ No newline at end of file diff --git a/modules/ContactForm/Resources/lang/en/admin/content.php b/modules/ContactForm/Resources/lang/en/admin/content.php deleted file mode 100644 index 134b9b30..00000000 --- a/modules/ContactForm/Resources/lang/en/admin/content.php +++ /dev/null @@ -1,15 +0,0 @@ - 'Contact form content', - 'address' => 'Address', - 'emailList' => 'Send emails to these addresses', - 'gpsLat' => 'GPS latitude', - 'gpsLng' => 'GPS longitude', - 'compName' => 'Name displayed above address', - 'phone' => 'Contact phone', - 'email' => 'E-mail', - 'contactEmail' => 'E-mail, where messages from this form will be delivered', - 'contactInformation' => 'Contact information', - 'subject' => 'Subject', - 'defaultSubject' => 'New message from contact form' -]; \ No newline at end of file diff --git a/modules/ContactForm/Resources/lang/en/admin/history.php b/modules/ContactForm/Resources/lang/en/admin/history.php deleted file mode 100644 index dab90865..00000000 --- a/modules/ContactForm/Resources/lang/en/admin/history.php +++ /dev/null @@ -1,12 +0,0 @@ - 'Phone', - 'columnAddress' => 'Address', - 'columnEmail' => 'E-mail', - 'columnContactEmail' => 'Contact E-mail', - 'columnSubject' => 'Subject', - 'columnCompanyName' => 'Company name', - 'columnGpsLat' => 'GPS Latitude', - 'columnGpsLng' => 'Gps Longitude', -]; - diff --git a/modules/ContactForm/Resources/lang/en/admin/settings.php b/modules/ContactForm/Resources/lang/en/admin/settings.php deleted file mode 100644 index 7bd1d2f4..00000000 --- a/modules/ContactForm/Resources/lang/en/admin/settings.php +++ /dev/null @@ -1,5 +0,0 @@ - 'reCAPTCHA site key', - 'recaptchaSecret' => 'reCAPTCHA application secret key', -]; \ No newline at end of file diff --git a/modules/ContactForm/Resources/lang/en/admin/widgets.php b/modules/ContactForm/Resources/lang/en/admin/widgets.php deleted file mode 100644 index 3d387a0d..00000000 --- a/modules/ContactForm/Resources/lang/en/admin/widgets.php +++ /dev/null @@ -1,16 +0,0 @@ - [ - 'name' => 'Address block', - 'description' => 'Small widget for displaying address saved in selected contact form.', - 'new' => 'New address block', - 'edit' => 'Editing address block' - ], - 'form' => [ - 'name' => 'Contact form', - 'description' => 'Display small contact form anywhere on website.', - 'new' => 'New contact form widget' - ], - 'noContactForms' => 'You have not created any contact form. Try to create one before creating this widget.', - 'selectContactForm' => 'Select contact form' -]; \ No newline at end of file diff --git a/modules/ContactForm/Resources/lang/en/module.php b/modules/ContactForm/Resources/lang/en/module.php deleted file mode 100644 index 3e9d374e..00000000 --- a/modules/ContactForm/Resources/lang/en/module.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Contact form', - 'description' => 'Simple contact form', - 'allForms' => 'All contact forms', - 'newForm' => 'Create new contact form', - 'editForm' => 'Editing contact form' -]; \ No newline at end of file diff --git a/modules/ContactForm/Resources/lang/sk/admin/adminMenu.php b/modules/ContactForm/Resources/lang/sk/admin/adminMenu.php deleted file mode 100644 index d4dcea93..00000000 --- a/modules/ContactForm/Resources/lang/sk/admin/adminMenu.php +++ /dev/null @@ -1,8 +0,0 @@ - "Kontaktný formulár", - "new" => "Nový", - "overview" => "Všetky formuláre", - "sentMessages" => "Správy", - "templatePath" => "Kontaktný formulár", -]; \ No newline at end of file diff --git a/modules/ContactForm/Resources/lang/sk/admin/content.php b/modules/ContactForm/Resources/lang/sk/admin/content.php deleted file mode 100644 index c283c250..00000000 --- a/modules/ContactForm/Resources/lang/sk/admin/content.php +++ /dev/null @@ -1,15 +0,0 @@ - "Adresa", - "compName" => "Názov zobrazený nad adresou", - "contactEmail" => "E-mail, kam budú doručované správy z tohoto formulára", - "contactInformation" => "Kontaktné informácie", - "content" => "Obsah kontaktného formulára", - "defaultSubject" => "Nová správa z kontaktného formulára", - "email" => "E-mail", - "emailList" => "Odosielať správy na tieto adresy", - "gpsLat" => "GPS šírka", - "gpsLng" => "GPS dĺžka", - "phone" => "Kontaktný telefón", - "subject" => "Predmet správy", -]; diff --git a/modules/ContactForm/Resources/lang/sk/admin/history.php b/modules/ContactForm/Resources/lang/sk/admin/history.php deleted file mode 100644 index c0664dfd..00000000 --- a/modules/ContactForm/Resources/lang/sk/admin/history.php +++ /dev/null @@ -1,11 +0,0 @@ - "Adresa", - "columnCompanyName" => "Názov spoločnosti", - "columnContactEmail" => "Kontaktný e-mail", - "columnEmail" => "E-mail", - "columnGpsLat" => "GPS šírka", - "columnGpsLng" => "GPS dĺžka", - "columnPhone" => "Telefón", - "columnSubject" => "Predmet", -]; diff --git a/modules/ContactForm/Resources/lang/sk/admin/settings.php b/modules/ContactForm/Resources/lang/sk/admin/settings.php deleted file mode 100644 index fa9eddd4..00000000 --- a/modules/ContactForm/Resources/lang/sk/admin/settings.php +++ /dev/null @@ -1,5 +0,0 @@ - "Application secret key pre reCaptcha", - "recaptchaSiteKey" => "Site key pre reCaptcha", -]; diff --git a/modules/ContactForm/Resources/lang/sk/module.php b/modules/ContactForm/Resources/lang/sk/module.php deleted file mode 100644 index ad642712..00000000 --- a/modules/ContactForm/Resources/lang/sk/module.php +++ /dev/null @@ -1,5 +0,0 @@ - "Jednoduchý kontaktný formulár", - "name" => "Kontaktný formulár", -]; diff --git a/modules/ContactForm/Resources/views/admin/form/basicInfo.blade.php b/modules/ContactForm/Resources/views/admin/form/basicInfo.blade.php deleted file mode 100644 index 184df299..00000000 --- a/modules/ContactForm/Resources/views/admin/form/basicInfo.blade.php +++ /dev/null @@ -1,136 +0,0 @@ -
    -
    - - - @include('admin.snippets.hasError', ['field' => 'title']) -
    -
    - - - - @include('admin.snippets.hasError', ['field' => 'url']) -
    -
    -
    - -
    -
    -
    - -
    -
    - - - @include('admin.snippets.hasError', ['field' => 'status']) -
    -
    - - - @include('admin.snippets.hasError', ['field' => 'parentPage']) -
    - - @if($module->support_categories && count($categories)) -
    - -
    - @endif -
    - -

    @lang('contactform::admin/content.contactInformation')

    - -
    -
    - - - - - - - - - - - - - - - - -
    - -
    - - - - - - - - -
    -
    - - - -
    -
    - - - -
    -
    -
    -
    diff --git a/modules/ContactForm/Resources/views/admin/form/content.blade.php b/modules/ContactForm/Resources/views/admin/form/content.blade.php deleted file mode 100644 index 5d680a14..00000000 --- a/modules/ContactForm/Resources/views/admin/form/content.blade.php +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file diff --git a/modules/ContactForm/Resources/views/admin/settings/form.blade.php b/modules/ContactForm/Resources/views/admin/settings/form.blade.php deleted file mode 100644 index a79ea856..00000000 --- a/modules/ContactForm/Resources/views/admin/settings/form.blade.php +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - -reCAPTCHA \ No newline at end of file diff --git a/modules/ContactForm/Resources/views/admin/widgets/address/edit.blade.php b/modules/ContactForm/Resources/views/admin/widgets/address/edit.blade.php deleted file mode 100644 index 00692dd9..00000000 --- a/modules/ContactForm/Resources/views/admin/widgets/address/edit.blade.php +++ /dev/null @@ -1,19 +0,0 @@ -@extends('admin.layoutWithNavigation') - -@section('pageHeading', @trans('contactform::admin/widgets.address.edit')) -@section('pageDescription', $widget->description) - -@section('content') - - @if(!count($forms)) -
    @lang('contactform::admin/widgets.noContactForms')
    - @else -
    - @include('contactform::admin.widgets.address.form', ['action' => route('widgets.postEdit', ['id' => $widget->id])]) -
    -
    - @widgetPreview($widget) -
    - @endif -@endsection - diff --git a/modules/ContactForm/Resources/views/admin/widgets/address/form.blade.php b/modules/ContactForm/Resources/views/admin/widgets/address/form.blade.php deleted file mode 100644 index e6cda721..00000000 --- a/modules/ContactForm/Resources/views/admin/widgets/address/form.blade.php +++ /dev/null @@ -1,19 +0,0 @@ -
    - @include('admin.widgets.snippets.commonForm') - - - - - - - - -
    \ No newline at end of file diff --git a/modules/ContactForm/Resources/views/admin/widgets/address/new.blade.php b/modules/ContactForm/Resources/views/admin/widgets/address/new.blade.php deleted file mode 100644 index 3a5eef53..00000000 --- a/modules/ContactForm/Resources/views/admin/widgets/address/new.blade.php +++ /dev/null @@ -1,14 +0,0 @@ -@extends('admin.layoutWithNavigation') - -@section('pageHeading', @trans('contactform::admin/widgets.address.new')) -@section('pageDescription', @trans($type->description)) - -@section('content') - - @if(!count($forms)) -
    @lang('contactform::admin/widgets.noContactForms')
    - @else - @include('contactform::admin.widgets.address.form', ['action' => route('widgets.postNew', ['type' => $type])]) - @endif -@endsection - diff --git a/modules/ContactForm/Resources/views/admin/widgets/form/edit.blade.php b/modules/ContactForm/Resources/views/admin/widgets/form/edit.blade.php deleted file mode 100644 index b3b0b98c..00000000 --- a/modules/ContactForm/Resources/views/admin/widgets/form/edit.blade.php +++ /dev/null @@ -1,19 +0,0 @@ -@extends('admin.layoutWithNavigation') - -@section('pageHeading', @trans('contactform::admin/widgets.address.edit')) -@section('pageDescription', $widget->description) - -@section('content') - - @if(!count($forms)) -
    @lang('contactform::admin/widgets.noContactForms')
    - @else -
    - @include('contactform::admin.widgets.form.form', ['action' => route('widgets.postEdit', ['id' => $widget->id])]) -
    -
    - @widgetPreview($widget) -
    - @endif -@endsection - diff --git a/modules/ContactForm/Resources/views/admin/widgets/form/form.blade.php b/modules/ContactForm/Resources/views/admin/widgets/form/form.blade.php deleted file mode 100644 index 19dfcd3e..00000000 --- a/modules/ContactForm/Resources/views/admin/widgets/form/form.blade.php +++ /dev/null @@ -1,17 +0,0 @@ -
    - @include('admin.widgets.snippets.commonForm') - - - - - - -
    \ No newline at end of file diff --git a/modules/ContactForm/Resources/views/admin/widgets/form/new.blade.php b/modules/ContactForm/Resources/views/admin/widgets/form/new.blade.php deleted file mode 100644 index fc3ff7cb..00000000 --- a/modules/ContactForm/Resources/views/admin/widgets/form/new.blade.php +++ /dev/null @@ -1,14 +0,0 @@ -@extends('admin.layoutWithNavigation') - -@section('pageHeading', @trans('contactform::admin/widgets.form.new')) -@section('pageDescription', @trans($type->description)) - -@section('content') - - @if(!count($forms)) -
    @lang('contactform::admin/widgets.noContactForms')
    - @else - @include('contactform::admin.widgets.form.form', ['action' => route('widgets.postNew', ['type' => $type])]) - @endif -@endsection - diff --git a/modules/ContactForm/Widgets/Address/Address.php b/modules/ContactForm/Widgets/Address/Address.php deleted file mode 100644 index 75d6f63f..00000000 --- a/modules/ContactForm/Widgets/Address/Address.php +++ /dev/null @@ -1,51 +0,0 @@ - $data->contactFormId]; - } -} \ No newline at end of file diff --git a/modules/ContactForm/Widgets/Address/Presenter.php b/modules/ContactForm/Widgets/Address/Presenter.php deleted file mode 100644 index d828752d..00000000 --- a/modules/ContactForm/Widgets/Address/Presenter.php +++ /dev/null @@ -1,76 +0,0 @@ -settings->contactFormId); - - if (!$form) - return null; - - $formData = $form->moduleSettings; - - $code = '
    container_id) { - $code .= ' id="' . e($widget->container_id).'"'; - } - $code .= '>'; - $code .= "

    ".e($formData['companyName']).'

    '; - $code .= nl2br($formData['address']); - $code .= "
    "; - - return $code; - } - - /** - * Display form for creating new instance of widget - * - * @param WidgetType $type - * - * @return mixed - */ - public static function renderAddForm(WidgetType $type) - { - $contactForms = Content::where('moduleHandler', config('contactform.handler')) - ->get(); - - return view('contactform::admin.widgets.address.new', [ - 'type' => $type, - 'widget' => new Widget(), - 'forms' => $contactForms - ]); - } - - /** - * Display form for editing already existing widget - * - * @param Widget $widget - * - * @return mixed - */ - public static function renderEditForm(Widget $widget) - { - $contactForms = Content::where('moduleHandler', config('contactform.handler')) - ->get(); - return view('contactform::admin.widgets.address.edit', [ - 'widget' => $widget, - 'forms' => $contactForms - ]); - } -} \ No newline at end of file diff --git a/modules/ContactForm/Widgets/Form/Form.php b/modules/ContactForm/Widgets/Form/Form.php deleted file mode 100644 index cb30e07f..00000000 --- a/modules/ContactForm/Widgets/Form/Form.php +++ /dev/null @@ -1,51 +0,0 @@ - $data->contactFormId]; - } -} \ No newline at end of file diff --git a/modules/ContactForm/Widgets/Form/Presenter.php b/modules/ContactForm/Widgets/Form/Presenter.php deleted file mode 100644 index b4859ede..00000000 --- a/modules/ContactForm/Widgets/Form/Presenter.php +++ /dev/null @@ -1,73 +0,0 @@ -settings->contactFormId); - - if (!$form) { - return null; - } - - return view(self::$template, ['widget' => $widget, 'form' => $form]); - } - - /** - * Display form for creating new instance of widget - * - * @param WidgetType $type - * - * @return mixed - */ - public static function renderAddForm(WidgetType $type) - { - $contactForms = Content::where('moduleHandler', config('contactform.handler')) - ->get(); - - return view('contactform::admin.widgets.form.new', [ - 'type' => $type, - 'widget' => new Widget(), - 'forms' => $contactForms - ]); - } - - /** - * Display form for editing already existing widget - * - * @param Widget $widget - * - * @return mixed - */ - public static function renderEditForm(Widget $widget) - { - $contactForms = Content::where('moduleHandler', config('contactform.handler')) - ->get(); - return view('contactform::admin.widgets.address.edit', [ - 'widget' => $widget, - 'forms' => $contactForms - ]); - } -} \ No newline at end of file diff --git a/modules/ContactForm/composer.json b/modules/ContactForm/composer.json deleted file mode 100644 index 6fe0e828..00000000 --- a/modules/ContactForm/composer.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "pingpong-modules/contactform", - "description": "", - "authors": [ - { - "name": "Pingpong Labs", - "email": "pingpong.labs@gmail.com" - } - ], - "autoload": { - "psr-4": { - "Modules\\ContactForm\\": "" - } - } -} \ No newline at end of file diff --git a/modules/ContactForm/start.php b/modules/ContactForm/start.php deleted file mode 100644 index 7be329cb..00000000 --- a/modules/ContactForm/start.php +++ /dev/null @@ -1,15 +0,0 @@ - 'Gallery', - 'translatedName' => 'gallery::module.name', - 'translatedDescription' => 'gallery::module.description', - 'alias' => 'gallery', - 'handler' => '\\Modules\\Gallery\\Handlers\\Gallery', - 'providers' => [\Modules\Gallery\Providers\GalleryServiceProvider::class], - 'files' => ['start.php'], - 'order' => 0, -]; \ No newline at end of file diff --git a/modules/Gallery/Handlers/Gallery.php b/modules/Gallery/Handlers/Gallery.php deleted file mode 100644 index 262acb3b..00000000 --- a/modules/Gallery/Handlers/Gallery.php +++ /dev/null @@ -1,255 +0,0 @@ -moduleSettings->directoryId; - - // get all images in given directory - $images = File::where('directory_id', $directoryId) - ->where('mime_type', 'LIKE', 'image%') - ->get(); - - // render content - return Controller::VisitorsView($content->template, [ - 'images' => $images, - 'page' => $content, - 'extra' => $parameters - ]); - } - - public static function getHistoryHandler() - { - return History::class; - } - - /** - * @param Content $content - * - * @return array - */ - public static function loadExtraData(Content $content) - { - if (is_string($content->moduleSettings)) { - $content->moduleSettings = json_decode($content->moduleSettings); - } - - $extra = [ - 'slider' => isset($content->moduleSettings->slider) ? $content->moduleSettings->slider : false - ]; - - return $extra; - } - - /** - * Save module-specific values into database - * - * @param Content $content - * @param Request $request - * - * @return mixed - * @internal param Widget $widget - */ - public static function createNew(Content &$content, Request $request) - { - $parentDirectoryId = Storage::get(self::CONFIG_FILENAME); - - // create new directory for images - $directory = Directory::create([ - 'name' => $content->id . '_' . $request->title, - 'description' => $request->description, - 'parent_id' => $parentDirectoryId - ]); - - // save id into module_config array - $settings = ['directoryId' => $directory->id]; - - // save settings - $content->moduleSettings = json_encode($settings); - } - - /** - * Method used for editing existing content page. - * - * Reason why it is separated from createNew() method is simple - we need to save history of changes. - * - * @param Content $content - * @param Request $request - * - * @param $revisionID string ID of revision used - * - * @return int number of edited fields - */ - public static function edit(Content &$content, Request $request, $revisionID) - { - // nothing to edit - } - - /** - * Does given module manage content? Or is it just module with widgets/something internal/something absolutely else? - * - * @return bool - */ - public static function managesContent() - { - return true; - } - - public static function getModuleId() - { - $handler = config('gallery.handler'); - $allModules = ModulesHandlerToId::getWithTranslations(); - $moduleId = isset($allModules[$handler]) ? $allModules[$handler] : null; - - return $moduleId; - } - - /** - * Getter for section names in creating/editing content resource - * - * @return mixed - */ - public static function getExtendedFormSections() - { - $sections = Handler::getExtendedFormSections(); - - $sections['upload'] = trans('gallery::admin/content.upload'); - - return $sections; - } - - /** - * Getter for views used in extended part of form for creating new content - * - * This method should return pairs . View is returned only as name in plain text - * - * @return array of views/templates/html codes divided into section - */ - public static function getExtendedFormInputsCreate() - { - $parts = Handler::getExtendedFormInputsCreate(); - $parts['upload'] = 'gallery::admin.content.newUpload'; - - return $parts; - } - - /** - * Getter for extended part of form for editing existing content - * - * Basically, this method may be - * - * @return array of views/templates/html codes divided into section - */ - public static function getExtendedFormInputsEdit() - { - $parts = Handler::getExtendedFormInputsCreate(); - $parts['upload'] = 'gallery::admin.content.editUpload'; - - return $parts; - } - - /** - * Register admin menu (or multiple ones) - * - * This cannot be in ServiceProvider because Session is started at middleware. And ServiceProvider is called before - * starting any middleware.. - * - * @param User $user model of logged user - */ - public static function registerAdminMenu(User $user) - { - $menu = \Menu::instance('mainMenu'); - $submenu = $menu->whereTitle(trans('admin/mainMenu.contentPages')); - $submenu->dropdown(trans('gallery::module.name'), function ($submenu) use ($user) { - $submenu->route('content.new', trans('gallery::admin/adminMenu.new'), ['moduleId' => self::getModuleId()], 10, ['icon' => 'fa fa-plus']); - $submenu->route('content.overview', trans('gallery::admin/adminMenu.overview'), ['moduleId' => self::getModuleId()], 20, ['icon' => 'fa fa-list']); - // $submenu->route('emails.sent', trans('contactform::admin/adminMenu.sentMessages'), [], 30, ['icon' => 'fa fa-send']); - }, 25, ['icon' => 'fa fa-camera']); - } - - /** - * Install module - * - * @return mixed - */ - public static function install() - { - $directory = Directory::where('name', self::DIRECTORY_NAME) - ->first(); - - if (!count($directory)) { - $directory = Directory::create([ - 'name' => self::DIRECTORY_NAME, - 'hidden' => true - ]); - } - - Storage::put(self::CONFIG_FILENAME, $directory->id); - } - - /** - * Method called right after content page is marked as deleted - * - * This method is supposed to clean after "deleted" page. - * - * @param Content $content - * - * @return mixed - */ - public static function delete(Content $content) - { - // try to convert moduleSettings into something more accessible - if (is_string($content->moduleSettings)) { - $content->moduleSettings = json_decode($content->moduleSettings); - } - - // get directory id - $directoryId = $content->moduleSettings->directoryId; - - $directory = Directory::find($directoryId); - - // check if gallery exists - if (!$directory) { - return; - } - - // delete directory used as photogallery - $directory->delete(); - } - - /** - * Does this module support categories? - * - * @return boolean - */ - public static function supportCategories() - { - return true; - } -} \ No newline at end of file diff --git a/modules/Gallery/Providers/GalleryServiceProvider.php b/modules/Gallery/Providers/GalleryServiceProvider.php deleted file mode 100644 index aac0bc39..00000000 --- a/modules/Gallery/Providers/GalleryServiceProvider.php +++ /dev/null @@ -1,16 +0,0 @@ -alias = 'gallery'; - } - - protected function setModulePath() - { - $this->path = __DIR__; - } -} diff --git a/modules/Gallery/Resources/lang/cs/admin/adminMenu.php b/modules/Gallery/Resources/lang/cs/admin/adminMenu.php deleted file mode 100644 index 91299728..00000000 --- a/modules/Gallery/Resources/lang/cs/admin/adminMenu.php +++ /dev/null @@ -1,6 +0,0 @@ - "Nová galerie", -"overview" => "Všechny galerie", -"templatePath" => "Šablony galerie", -]; diff --git a/modules/Gallery/Resources/lang/cs/admin/content.php b/modules/Gallery/Resources/lang/cs/admin/content.php deleted file mode 100644 index ac72921f..00000000 --- a/modules/Gallery/Resources/lang/cs/admin/content.php +++ /dev/null @@ -1,11 +0,0 @@ - "Tato stránka není platnou fotogalerií.", -"makeSlider" => "Vytvořit slider z této fotogalerie", -"orbitSliderMissing" => "Nelze vytvořit slider. Widget pro zobrazení slideru není nainstalován.", -"sliderCreated" => "Slider úspěšně vytvořen.", -"sliderEdit" => "Nastavení slideru", -"sliderFailed" => "Slider nemohl být vytvořen. Zpráva: :message", -"upload" => "Nahrát fotografie", -"uploadAfterSavingGallery" => "Nahrávání do této galerie zatím není dostupné. Uložte galerii a nahrávejte fotografie až v rámci editace.", -]; diff --git a/modules/Gallery/Resources/lang/cs/module.php b/modules/Gallery/Resources/lang/cs/module.php deleted file mode 100644 index 337dd6d5..00000000 --- a/modules/Gallery/Resources/lang/cs/module.php +++ /dev/null @@ -1,5 +0,0 @@ - "Jednoduchá galerie zobrazující fotografie/grafiku v jednoduchém lightboxu. Tento modul nenabízí žádné speciální zobrazení pro fotografie.", -"name" => "Galerie", -]; diff --git a/modules/Gallery/Resources/lang/en/admin/adminMenu.php b/modules/Gallery/Resources/lang/en/admin/adminMenu.php deleted file mode 100644 index 099f852a..00000000 --- a/modules/Gallery/Resources/lang/en/admin/adminMenu.php +++ /dev/null @@ -1,6 +0,0 @@ - 'Gallery templates', - 'new' => 'New gallery', - 'overview' => 'All galleries' -]; \ No newline at end of file diff --git a/modules/Gallery/Resources/lang/en/admin/content.php b/modules/Gallery/Resources/lang/en/admin/content.php deleted file mode 100644 index c7741f22..00000000 --- a/modules/Gallery/Resources/lang/en/admin/content.php +++ /dev/null @@ -1,11 +0,0 @@ - 'Upload photos', - 'uploadAfterSavingGallery' => 'Uploading for this gallery is not available yet. You must create the gallery first and upload later.', - 'makeSlider' => 'Make slider from this photogallery', - 'orbitSliderMissing' => 'Cannot create slider. Widget for slider is not installed.', - 'invalidGallery' => 'This content page is not a valid gallery page.', - 'sliderFailed' => 'Slider could not be created. Reason: :message', - 'sliderCreated' => 'Slider successfully created.', - 'sliderEdit' => 'Slider settings', -]; \ No newline at end of file diff --git a/modules/Gallery/Resources/lang/en/module.php b/modules/Gallery/Resources/lang/en/module.php deleted file mode 100644 index 6b0048ab..00000000 --- a/modules/Gallery/Resources/lang/en/module.php +++ /dev/null @@ -1,6 +0,0 @@ - 'Gallery', - 'description' => 'Simple photogallery', - -]; \ No newline at end of file diff --git a/modules/Gallery/Resources/lang/sk/admin/adminMenu.php b/modules/Gallery/Resources/lang/sk/admin/adminMenu.php deleted file mode 100644 index bd541608..00000000 --- a/modules/Gallery/Resources/lang/sk/admin/adminMenu.php +++ /dev/null @@ -1,6 +0,0 @@ - "Nová galéria", -"overview" => "Všetky galérie", -"templatePath" => "Šablóny galérie", -]; diff --git a/modules/Gallery/Resources/lang/sk/admin/content.php b/modules/Gallery/Resources/lang/sk/admin/content.php deleted file mode 100644 index 41ffac65..00000000 --- a/modules/Gallery/Resources/lang/sk/admin/content.php +++ /dev/null @@ -1,11 +0,0 @@ - "Táto stránka nie je platná fotogaléria.", - "makeSlider" => "Vytvoriť slider z tejto fotogalérie", - "orbitSliderMissing" => "Nie je možné vytvoriť slider. Widget pre zobrazenie slideru nie je nainštalovaný.", - "sliderCreated" => "Slider úspešne vytvorený.", - "sliderEdit" => "Nastavenie slideru", - "sliderFailed" => "Slider nemohol byť vytvorený. Správa: :message", - "upload" => "Nahrať fotografie", - "uploadAfterSavingGallery" => "Nahrávanie do tejto galérie nie je dostupné. Najprv uložte galériu a fotografie nahrávajte až v rámci editácie.", -]; diff --git a/modules/Gallery/Resources/lang/sk/module.php b/modules/Gallery/Resources/lang/sk/module.php deleted file mode 100644 index 01532983..00000000 --- a/modules/Gallery/Resources/lang/sk/module.php +++ /dev/null @@ -1,5 +0,0 @@ - "Jednoduchá galéria zobrazujúca fotografie/grafiku v jednoduchom lightboxe. Tento modul neponúka žiadne špeciálne zobrazovanie fotografií.", - "name" => "Galéria", -]; diff --git a/modules/Gallery/Resources/views/admin/content/editUpload.blade.php b/modules/Gallery/Resources/views/admin/content/editUpload.blade.php deleted file mode 100644 index 75f03669..00000000 --- a/modules/Gallery/Resources/views/admin/content/editUpload.blade.php +++ /dev/null @@ -1,12 +0,0 @@ - - - -
    \ No newline at end of file diff --git a/modules/Gallery/Resources/views/admin/content/newUpload.blade.php b/modules/Gallery/Resources/views/admin/content/newUpload.blade.php deleted file mode 100644 index 8d84eda9..00000000 --- a/modules/Gallery/Resources/views/admin/content/newUpload.blade.php +++ /dev/null @@ -1,3 +0,0 @@ -
    - @lang('gallery::admin/content.uploadAfterSavingGallery') -
    \ No newline at end of file diff --git a/modules/Gallery/composer.json b/modules/Gallery/composer.json deleted file mode 100644 index 24d1e0a0..00000000 --- a/modules/Gallery/composer.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "pingpong-modules/gallery", - "description": "", - "authors": [ - { - "name": "Pingpong Labs", - "email": "pingpong.labs@gmail.com" - } - ], - "autoload": { - "psr-4": { - "Modules\\Gallery\\": "" - } - } -} \ No newline at end of file diff --git a/modules/Gallery/start.php b/modules/Gallery/start.php deleted file mode 100644 index a4abe2da..00000000 --- a/modules/Gallery/start.php +++ /dev/null @@ -1,2 +0,0 @@ - 'StaticPages', - 'translatedName' => 'staticpages::module.name', - 'translatedDescription' => 'staticpages::module.description', - 'alias' => 'staticpages', - 'handler' => '\\Modules\\StaticPages\\Handlers\\StaticPage', - 'providers' => [\Modules\Staticpages\Providers\StaticPagesServiceProvider::class], - 'files' => ['start.php'], - 'order' => 0, -]; \ No newline at end of file diff --git a/modules/StaticPages/Handlers/StaticPage.php b/modules/StaticPages/Handlers/StaticPage.php deleted file mode 100644 index e2926855..00000000 --- a/modules/StaticPages/Handlers/StaticPage.php +++ /dev/null @@ -1,76 +0,0 @@ -whereTitle(trans('admin/mainMenu.contentPages')); - - $submenu->dropdown(trans('staticpages::adminMenu.staticPages'), function ($submenu) use ($user) { - $submenu->route('content.new', trans('staticpages::adminMenu.new'), ['module' => config('staticpages.alias')], 10, ['icon' => 'fa fa-plus']); - $submenu->route('content.overview', trans('staticpages::adminMenu.overview'), ['module' => config('staticpages.alias')], 20, ['icon' => 'fa fa-list']); - }, 15, ['icon' => 'fa fa-newspaper-o']); - } - - /** - * Get translated title for pages overview of given type. - * - * This value is used for rendering list of all content pages of given type in administration. - * - * @return string - */ - public static function getOverviewTitle() - { - return trans('staticpages::module.allPages'); - } - - /** - * Title displayed above for for creating new content page - * - * @return string - */ - public static function getCreateNewTitle() - { - return trans('staticpages::module.newPage'); - } - - /** - * Title for form displayed for editin content page - * - * @param Content $content - * - * @return mixed - */ - public static function getEditTitle(Content $content) - { - return trans('staticpages::module.editPage'); - } - - /** - * Does given module manage content? Or is it just module with widgets/something internal/something absolutely else? - * - * @return bool - */ - public static function managesContent() - { - return true; - } - - /** - * Does this module support categories? - * - * @return boolean - */ - public static function supportCategories() - { - return true; - } -} \ No newline at end of file diff --git a/modules/StaticPages/Providers/StaticPagesServiceProvider.php b/modules/StaticPages/Providers/StaticPagesServiceProvider.php deleted file mode 100644 index ba92ce7f..00000000 --- a/modules/StaticPages/Providers/StaticPagesServiceProvider.php +++ /dev/null @@ -1,16 +0,0 @@ -alias = 'staticpages'; - } - - protected function setModulePath() - { - $this->path = __DIR__; - } -} diff --git a/modules/StaticPages/Resources/lang/cs/admin.php b/modules/StaticPages/Resources/lang/cs/admin.php deleted file mode 100644 index 9f233cff..00000000 --- a/modules/StaticPages/Resources/lang/cs/admin.php +++ /dev/null @@ -1,6 +0,0 @@ - "Nová stránka", -"overview" => "Seznam všech statických stránek", -"templatePath" => "Statické stránky", -]; diff --git a/modules/StaticPages/Resources/lang/cs/adminMenu.php b/modules/StaticPages/Resources/lang/cs/adminMenu.php deleted file mode 100644 index 48aa0404..00000000 --- a/modules/StaticPages/Resources/lang/cs/adminMenu.php +++ /dev/null @@ -1,6 +0,0 @@ - "Vytvořit novou", -"overview" => "Přehled", -"staticPages" => "Statické stránky", -]; diff --git a/modules/StaticPages/Resources/lang/cs/module.php b/modules/StaticPages/Resources/lang/cs/module.php deleted file mode 100644 index e0dfbbeb..00000000 --- a/modules/StaticPages/Resources/lang/cs/module.php +++ /dev/null @@ -1,8 +0,0 @@ - "Všechny statické stránky", -"description" => "Statické stránky jsou určeny k zobrazování statického obsahu na stránkách.", -"editPage" => "Upravuji statickou stránku", -"name" => "Statické stránky", -"newPage" => "Vytvářím novou stránku", -]; diff --git a/modules/StaticPages/Resources/lang/en/admin.php b/modules/StaticPages/Resources/lang/en/admin.php deleted file mode 100644 index c7ee3368..00000000 --- a/modules/StaticPages/Resources/lang/en/admin.php +++ /dev/null @@ -1,6 +0,0 @@ - 'List of all static pages', - 'templatePath' => 'Static pages', - 'new' => 'nova stranka' -]; \ No newline at end of file diff --git a/modules/StaticPages/Resources/lang/en/adminMenu.php b/modules/StaticPages/Resources/lang/en/adminMenu.php deleted file mode 100644 index ae842272..00000000 --- a/modules/StaticPages/Resources/lang/en/adminMenu.php +++ /dev/null @@ -1,6 +0,0 @@ - 'Static pages', - 'new' => 'Create new', - 'overview' => 'Overview' -]; \ No newline at end of file diff --git a/modules/StaticPages/Resources/lang/en/module.php b/modules/StaticPages/Resources/lang/en/module.php deleted file mode 100644 index db22a5b4..00000000 --- a/modules/StaticPages/Resources/lang/en/module.php +++ /dev/null @@ -1,8 +0,0 @@ - 'Static pages', - 'description' => 'Static pages are intended for displaying static content on webpage.', - 'allPages' => 'All static pages', - 'editPage' => 'Editing static page', - 'newPage' => 'Create new static page' -]; \ No newline at end of file diff --git a/modules/StaticPages/Resources/lang/sk/admin.php b/modules/StaticPages/Resources/lang/sk/admin.php deleted file mode 100644 index ba6b774e..00000000 --- a/modules/StaticPages/Resources/lang/sk/admin.php +++ /dev/null @@ -1,6 +0,0 @@ - "Nová stránka", - "overview" => "Zoznam všetkých statických stránok", - "templatePath" => "Statické stránky", -]; diff --git a/modules/StaticPages/Resources/lang/sk/adminMenu.php b/modules/StaticPages/Resources/lang/sk/adminMenu.php deleted file mode 100644 index 89bf8bd4..00000000 --- a/modules/StaticPages/Resources/lang/sk/adminMenu.php +++ /dev/null @@ -1,6 +0,0 @@ - "Vytvoriť novú", - "overview" => "Prehľad", - "staticPages" => "Statické stránky", -]; diff --git a/modules/StaticPages/Resources/lang/sk/module.php b/modules/StaticPages/Resources/lang/sk/module.php deleted file mode 100644 index c3f11703..00000000 --- a/modules/StaticPages/Resources/lang/sk/module.php +++ /dev/null @@ -1,5 +0,0 @@ - "Statické stránky sú určené k zobrazovaniu statického obsahu na webe.", - "name" => "Statické stránky", -]; diff --git a/modules/StaticPages/composer.json b/modules/StaticPages/composer.json deleted file mode 100644 index d9cb85d6..00000000 --- a/modules/StaticPages/composer.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "pingpong-modules/staticpages", - "description": "", - "authors": [ - { - "name": "Pingpong Labs", - "email": "pingpong.labs@gmail.com" - } - ], - "autoload": { - "psr-4": { - "Modules\\StaticPages\\": "" - } - } -} \ No newline at end of file diff --git a/modules/StaticPages/start.php b/modules/StaticPages/start.php deleted file mode 100644 index b3d9bbc7..00000000 --- a/modules/StaticPages/start.php +++ /dev/null @@ -1 +0,0 @@ - - ./tests/unit/ + ./tests/Unit/ diff --git a/public/.htaccess b/public/.htaccess index 8eb2dd0d..47a002ec 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -14,3 +14,69 @@ RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] + + + + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/vnd.ms-fontobject + AddOutputFilterByType DEFLATE application/x-font + AddOutputFilterByType DEFLATE application/x-font-opentype + AddOutputFilterByType DEFLATE application/x-font-otf + AddOutputFilterByType DEFLATE application/x-font-truetype + AddOutputFilterByType DEFLATE application/x-font-ttf + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE font/opentype + AddOutputFilterByType DEFLATE font/otf + AddOutputFilterByType DEFLATE font/ttf + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE image/x-icon + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/javascript + AddOutputFilterByType DEFLATE text/plain + + + + mod_gzip_on Yes + mod_gzip_dechunk Yes + mod_gzip_item_include file .(html?|txt|css|js|php|pl)$ + mod_gzip_item_include handler ^cgi-script$ + mod_gzip_item_include mime ^text/.* + mod_gzip_item_include mime ^application/x-javascript.* + mod_gzip_item_exclude mime ^image/.* + mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.* + +# +# Leverage Browser Caching + + ExpiresActive On + ExpiresByType image/jpg "access 1 year" + ExpiresByType image/jpeg "access 1 year" + ExpiresByType image/gif "access 1 year" + ExpiresByType image/png "access 1 year" + ExpiresByType text/css "access 1 month" + ExpiresByType text/html "access 1 month" + ExpiresByType application/pdf "access 1 month" + ExpiresByType text/x-javascript "access 1 month" + ExpiresByType application/x-shockwave-flash "access 1 month" + ExpiresByType image/x-icon "access 1 year" + ExpiresDefault "access 1 month" + + + + + Header set Cache-Control "max-age=2678400, public" + + + Header set Cache-Control "max-age=7200, private, must-revalidate" + + + Header set Cache-Control "max-age=86400, public" + + + Header set Cache-Control "max-age=2678400, private" + + \ No newline at end of file diff --git a/public/index.php b/public/index.php old mode 100644 new mode 100755 diff --git a/resources/assets/admin/css/custom.css b/resources/assets/admin/css/custom.css index d3d68009..da3ef95c 100644 --- a/resources/assets/admin/css/custom.css +++ b/resources/assets/admin/css/custom.css @@ -22,8 +22,9 @@ a:focus { padding-bottom: 20px !important; } -.form-control { - margin: .3em 0; +.blur { + -webkit-filter: blur(3px); + filter: blur(3px); } .text-center { @@ -413,5 +414,11 @@ img { /*background-color: #C9302C;*/ /*}*/ +.has-subpages:hover { + cursor: pointer; +} +#orderSetup .subpage td:first-child { + padding-left: 35px; +} diff --git a/resources/assets/admin/js/app.js b/resources/assets/admin/js/app.js index fbb223ad..5ca40345 100644 --- a/resources/assets/admin/js/app.js +++ b/resources/assets/admin/js/app.js @@ -1,487 +1,9 @@ -var config = window.config = {}; - -// Config reference element -var $ref = $ ("#ref"); - -// Configure responsive bootstrap toolkit -config.ResponsiveBootstrapToolkitVisibilityDivs = { - 'xs': $ ('
    '), - 'sm': $ ('
    '), - 'md': $ ('
    '), - 'lg': $ ('
    '), - 'xl': $ ('
    ') -}; - -ResponsiveBootstrapToolkit.use ('Custom', config.ResponsiveBootstrapToolkitVisibilityDivs); - -//validation configuration -config.validations = { - debug: true, - errorClass: 'has-error', - validClass: 'success', - errorElement: "span", - - // add error class - highlight: function (element, errorClass, validClass) { - $ (element).parents ("div.form-group") - .addClass (errorClass) - .removeClass (validClass); - }, - - // add error class - unhighlight: function (element, errorClass, validClass) { - $ (element).parents (".has-error") - .removeClass (errorClass) - .addClass (validClass); - }, - - // submit handler - submitHandler: function (form) { - form.submit (); - } -}; - -//delay time configuration -config.delayTime = 50; - -// chart configurations -config.chart = {}; - -/*********************************************** - * Animation Settings - ***********************************************/ -function animate(options) { - var animationName = "animated " + options.name; - var animationEnd = "webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend"; - $ (options.selector) - .addClass (animationName) - .one (animationEnd, - function () { - $ (this).removeClass (animationName); - } - ); -} - -$ (function () { - var $itemActions = $ (".item-actions-dropdown"); - - $ (document).on ('click', function (e) { - if (!$ (e.target).closest ('.item-actions-dropdown').length) { - $itemActions.removeClass ('active'); - } - }); - - $ ('.item-actions-toggle-btn').on ('click', function (e) { - e.preventDefault (); - - var $thisActionList = $ (this).closest ('.item-actions-dropdown'); - - $itemActions.not ($thisActionList).removeClass ('active'); - - $thisActionList.toggleClass ('active'); - }); -}); - -// /*********************************************** -// * NProgress Settings -// ***********************************************/ -// var npSettings = { -// easing: 'ease', -// speed: 500 -// }; -// -// NProgress.configure (npSettings); -// $ (function () { -// setSameHeights (); -// -// var resizeTimer; -// -// $ (window).resize (function () { -// clearTimeout (resizeTimer); -// resizeTimer = setTimeout (setSameHeights, 150); -// }); -// }); - -function setSameHeights($container) { - - $container = $container || $ ('.sameheight-container'); - - var viewport = ResponsiveBootstrapToolkit.current (); - - $container.each (function () { - - var $items = $ (this).find (".sameheight-item"); - - // Get max height of items in container - var maxHeight = 0; - - $items.each (function () { - $ (this).css ({height: 'auto'}); - maxHeight = Math.max (maxHeight, $ (this).innerHeight ()); - }); - - // Set heights of items - $items.each (function () { - // Ignored viewports for item - var excludedStr = $ (this).data ('exclude') || ''; - var excluded = excludedStr.split (','); - - // Set height of element if it's not excluded on - if (excluded.indexOf (viewport) === -1) { - $ (this).innerHeight (maxHeight); - } - }); - }); -} - -$ (function () { - animate ({ - name: 'flipInY', - selector: '.error-card > .error-title-block' - }); - - setTimeout (function () { - var $el = $ ('.error-card > .error-container'); - - animate ({ - name: 'fadeInUp', - selector: $el - }); - - $el.addClass ('visible'); - }, 500); -}); - -$ (function () { - - $ ('#sidebar-menu, #customize-menu').metisMenu ({ - activeClass: 'open' - }); - - $ ('#sidebar-collapse-btn').on ('click', function (event) { - event.preventDefault (); - - $ ("#app").toggleClass ("sidebar-open"); - }); - - $ ("#sidebar-overlay").on ('click', function () { - $ ("#app").removeClass ("sidebar-open"); - }); - -}); -$ (function () { - - $ ('.actions-list > li').on ('click', '.check', function (e) { - e.preventDefault (); - - $ (this).parents ('.tasks-item') - .find ('.checkbox') - .prop ("checked", true); - - // removeActionList (); - }); - -}); - -// $ (function () { - - // // set sortable options - // $ ('.images-container').sortable ({ - // animation: 150, - // handle: ".control-btn.move", - // draggable: ".image-container", - // onMove: function (evt) { - // var $relatedElem = $ (evt.related); - // - // if ($relatedElem.hasClass ('add-image')) { - // return false; - // } - // } - // }); - // - // var $controlsButtons = $ ('.controls'); - // - // var $controlsButtonsStar = $controlsButtons.find ('.star'); - // - // $controlsButtonsStar.on ('click', function (e) { - // e.preventDefault (); - // - // $controlsButtonsStar.removeClass ('active'); - // $controlsButtonsStar.parents ('.image-container').removeClass ('main'); - // - // $ (this).addClass ('active'); - // - // $ (this).parents ('.image-container').addClass ('main'); - // }) -// }); - -$ (function () { - $ ('.nav-profile > li > a').on ('click', function () { - var $el = $ (this).next (); - - animate ({ - name: 'flipInX', - selector: $el - }); - }); -}); - -$ (function () { - // Local storage settings - var themeSettings = getThemeSettings (); - - // Elements - - var $app = $ ('#app'); - var $styleLink = $ ('#theme-style'); - var $customizeMenu = $ ('#customize-menu'); - - // Color switcher - var $customizeMenuColorBtns = $customizeMenu.find ('.color-item'); - - // Position switchers - var $customizeMenuRadioBtns = $customizeMenu.find ('.radio'); - - // ///////////////////////////////////////////////// - - // Initial state - - // On setting event, set corresponding options - - // Update customize view based on options - - // Update theme based on options - - /************************************************ - * Initial State - *************************************************/ - - setThemeSettings (); - - /************************************************ - * Events - *************************************************/ - - // set theme type - $customizeMenuColorBtns.on ('click', function () { - themeSettings.themeName = $ (this).data ('theme'); - - setThemeSettings (); - }); - - $customizeMenuRadioBtns.on ('click', function () { - - var optionName = $ (this).prop ('name'); - themeSettings[optionName] = $ (this).val (); - - setThemeSettings (); - }); - - function setThemeSettings() { - setThemeState () - .delay (config.delayTime) - .queue (function (next) { - - setThemeColor (); - setThemeControlsState (); - saveThemeSettings (); - - $ (document).trigger ("themechange"); - - next (); - }); - } - - /************************************************ - * Update theme based on options - *************************************************/ - - function setThemeState() { - // set theme type - if (themeSettings.themeName) { - $styleLink.attr ('href', window.cssPath + '/app-' + themeSettings.themeName + '.css'); - } - else { - $styleLink.attr ('href', window.cssPath + '/app.css'); - } - // App classes - $app.removeClass ('header-fixed footer-fixed sidebar-fixed'); - - // set header - $app.addClass (themeSettings.headerPosition); - - // set footer - $app.addClass (themeSettings.footerPosition); - - // set footer - $app.addClass (themeSettings.sidebarPosition); - - return $app; - } - - /************************************************ - * Update theme controls based on options - *************************************************/ - - function setThemeControlsState() { - // set color switcher - $customizeMenuColorBtns.each (function () { - if ($ (this).data ('theme') === themeSettings.themeName) { - $ (this).addClass ('active'); - } - else { - $ (this).removeClass ('active'); - } - }); - - // set radio buttons - $customizeMenuRadioBtns.each (function () { - var name = $ (this).prop ('name'); - var value = $ (this).val (); - - if (themeSettings[name] === value) { - $ (this).prop ("checked", true); - } - else { - $ (this).prop ("checked", false); - } - }); - } - - /************************************************ - * Update theme color - *************************************************/ - function setThemeColor() { - config.chart.colorPrimary = tinycolor ($ref.find (".chart .color-primary").css ("color")); - config.chart.colorSecondary = tinycolor ($ref.find (".chart .color-secondary").css ("color")); - } - - /************************************************ - * Storage Functions - *************************************************/ - - function getThemeSettings() { - var settings = (localStorage.getItem ('themeSettings')) ? JSON.parse (localStorage.getItem ('themeSettings')) : {}; - - settings.headerPosition = settings.headerPosition || ''; - settings.sidebarPosition = settings.sidebarPosition || ''; - settings.footerPosition = settings.footerPosition || ''; - - return settings; - } - - function saveThemeSettings() { - localStorage.setItem ('themeSettings', JSON.stringify (themeSettings)); - } - -}); - -$ (function () { +// bind some custom methods +$ (document).ready (function () { $ ("body").addClass ("loaded"); - var notification = $ ('.notification'); - if (notification.length) { - - notification.click (function () { - $ (this).fadeOut ('fast'); - }); - - setTimeout (function () { - notification.fadeOut (1500) - }, 5 * 1000) - } -}); - -/** - * Makes slug from input string - * - * @param text - * @param trimSpaces - * - * @returns {string} - */ -function slugify(text, trimSpaces) { - text = text.toString ().toLowerCase (); - - if (trimSpaces) - text = text.trim (); - - return text.replace (/ /g, '-') - .replace (/[àáâãäå]/g, "a") - .replace (/[čç]/g, "c") - .replace (/[ěèéêë]/g, "e") - .replace (/[ùúûüů]/g, "u") - .replace (/[ìíîï]/g, "i") - .replace (/[ňńñ]/g, "n") - .replace (/[òóôõö]/g, "o") - .replace (/[ýÿ]/g, "y") - .replace (/œ/g, "oe") - .replace (/ď/g, "d") - .replace (/ř/g, "r") - .replace (/š/g, "s") - .replace (/ž/g, "z") - .replace (/ť/g, "t") - .replace (/æ/g, "ae") - .replace (/[^a-z0-9\-]+/g, '') - .replace (/--+/g, '-'); -} - -// bind some custom methods -$ (document).ready (function () { - var previousTitle, previousMessage; - - $ ('.confirm').click (function (e) { - - var titleElement = $ ('#confirmation-title'); - var messageElement = $ ('#confirmation-message'); - - previousTitle = titleElement.text (); - previousMessage = messageElement.text (); - - var confirmTitle = $ (this).data ('title'); - var confirmMessage = $ (this).data ('message'); - var href = $ (this).attr ('href'); - - $ ('#confirm-button').attr ('href', href); - - if (confirmTitle) - titleElement.text (confirmTitle); - - if (confirmMessage) - messageElement.text (confirmMessage); - - $ ('#confirm-modal').modal ('show'); - - e.preventDefault (); - }); - - $ ('#confirm-modal').on ('hidden.bs.modal', function () { - $ ('#confirmation-title').text (previousTitle); - $ ('#confirmation-message').text (previousMessage); - }); - - $ ('#lockUrl').change (function () { - $ ('.slug-source').keyup (); - }); - - $ ('.slug-target').keyup (function () { - $ (this).val (slugify ($ (this).val (), false)); - $ ('#lockUrl').prop ('checked', true); - }); - - $ ('.slug-source').keyup (function () { - var source = $ (this); - var target = $ ('.slug-target'); - var locked = $ ('#lockUrl'); - - if (!locked.is (':checked')) - target.val (slugify (source.val (), true)); - }); - - $ (function () { - $ ('[data-toggle="tooltip"]').tooltip () - }); + $ ('[data-toggle="tooltip"]').tooltip () // find if any error occured and mark tab with that error $ ('.has-error').each (function () { @@ -491,20 +13,31 @@ $ (document).ready (function () { $ ("#" + tabCard.prop ('id') + "-tab").addClass ('tab-with-error'); }); - $('#removeTitlePhoto').click(function () { - $('#titlePhotoContainer').remove(); - // $('existingTitlePhoto').val(null); + $ ('#removeTitlePhoto').click (function () { + $ ('#titlePhotoContainer').remove (); }); - $('form').areYouSure(); + $ ('form').areYouSure (); }); -// /*********************************************** -// * NProgress Settings -// ***********************************************/ -// -// // start load bar -// NProgress.start (); -// -// // end loading bar -// NProgress.done (); \ No newline at end of file +$ ('.checkbox').change (function () { + var e = $ (this); + var checked = e.is (':checked'); + var id = e.data ('id'); + + $ ('.child-' + id).prop ('checked', checked); + + // check also parent + if (e.hasClass ('child-checkbox') && checked) { + var parent = e.data ('parent'); + $ ('#checkbox-parent-' + parent).prop ('checked', true); + } +}); + +$ ('.has-subpages').click (function (e) { + if (!$ (e.target).is ("div")) + return; + + var id = $ (this).data ('id'); + $ ('.parent-page-' + id).toggleClass ('hidden-xs-up'); +}) \ No newline at end of file diff --git a/resources/assets/admin/js/confirmModal.js b/resources/assets/admin/js/confirmModal.js new file mode 100644 index 00000000..93c3c603 --- /dev/null +++ b/resources/assets/admin/js/confirmModal.js @@ -0,0 +1,43 @@ +var previousTitle, previousMessage; + +$ ('.confirm').click (function (e) { + + var titleElement = $ ('#confirmation-title'); + var messageElement = $ ('#confirmation-message'); + + previousTitle = titleElement.text (); + previousMessage = messageElement.text (); + + var confirmTitle = $ (this).data ('title'); + var confirmMessage = $ (this).data ('message'); + + var tag = $ (this).prop ('tagName'); + if (tag === 'A') { + var href = $ (this).attr ('href'); + + $ ('#confirm-button').attr ('href', href); + } else if (tag === 'BUTTON') { + var form = $ (this).closest ('form'); + $ ('#confirm-button').click (function () { + form.submit (); + }) + } + + if (confirmTitle) + titleElement.text (confirmTitle); + + if (confirmMessage) + messageElement.text (confirmMessage); + + $ ('#confirm-modal').modal ('show'); + + $ ('.main-wrapper').addClass ('blur'); + + e.preventDefault (); +}); + +$ ('#confirm-modal').on ('hidden.bs.modal', function () { + $ ('#confirmation-title').text (previousTitle); + $ ('#confirmation-message').text (previousMessage); + $ ('.main-wrapper').removeClass ('blur'); +}); \ No newline at end of file diff --git a/resources/assets/admin/js/notification.js b/resources/assets/admin/js/notification.js new file mode 100644 index 00000000..44a7f6fd --- /dev/null +++ b/resources/assets/admin/js/notification.js @@ -0,0 +1,11 @@ +var notification = $ ('.notification'); +if (notification.length) { + + notification.click (function () { + $ (this).fadeOut ('fast'); + }); + + setTimeout (function () { + notification.fadeOut (1500) + }, 5 * 1000) +} \ No newline at end of file diff --git a/resources/assets/admin/js/slugify.js b/resources/assets/admin/js/slugify.js new file mode 100644 index 00000000..9892f153 --- /dev/null +++ b/resources/assets/admin/js/slugify.js @@ -0,0 +1,51 @@ +/** + * Makes slug from input string + * + * @param text + * @param trimSpaces + * + * @returns {string} + */ +function slugify(text, trimSpaces) { + text = text.toString ().toLowerCase (); + + if (trimSpaces) + text = text.trim (); + + return text.replace (/ /g, '-') + .replace (/[àáâãäå]/g, "a") + .replace (/[čç]/g, "c") + .replace (/[ěèéêë]/g, "e") + .replace (/[ùúûüů]/g, "u") + .replace (/[ìíîï]/g, "i") + .replace (/[ňńñ]/g, "n") + .replace (/[òóôõö]/g, "o") + .replace (/[ýÿ]/g, "y") + .replace (/œ/g, "oe") + .replace (/ď/g, "d") + .replace (/ř/g, "r") + .replace (/š/g, "s") + .replace (/ž/g, "z") + .replace (/ť/g, "t") + .replace (/æ/g, "ae") + .replace (/[^a-z0-9\-]+/g, '') + .replace (/--+/g, '-'); +} + +$ ('#lockUrl').change (function () { + $ ('.slug-source').keyup (); +}); + +$ ('.slug-target').keyup (function () { + $ (this).val (slugify ($ (this).val (), false)); + $ ('#lockUrl').prop ('checked', true); +}); + +$ ('.slug-source').keyup (function () { + var source = $ (this); + var target = $ ('.slug-target'); + var locked = $ ('#lockUrl'); + + if (!locked.is (':checked')) + target.val (slugify (source.val (), true)); +}); diff --git a/resources/assets/admin/js/theme.js b/resources/assets/admin/js/theme.js new file mode 100644 index 00000000..506a8f9b --- /dev/null +++ b/resources/assets/admin/js/theme.js @@ -0,0 +1,316 @@ +var config = window.config = {}; + +// Config reference element +var $ref = $ ("#ref"); + +// Configure responsive bootstrap toolkit +config.ResponsiveBootstrapToolkitVisibilityDivs = { + 'xs': $ ('
    '), + 'sm': $ ('
    '), + 'md': $ ('
    '), + 'lg': $ ('
    '), + 'xl': $ ('
    ') +}; + +ResponsiveBootstrapToolkit.use ('Custom', config.ResponsiveBootstrapToolkitVisibilityDivs); + +//validation configuration +config.validations = { + debug: true, + errorClass: 'has-error', + validClass: 'success', + errorElement: "span", + + // add error class + highlight: function (element, errorClass, validClass) { + $ (element).parents ("div.form-group") + .addClass (errorClass) + .removeClass (validClass); + }, + + // add error class + unhighlight: function (element, errorClass, validClass) { + $ (element).parents (".has-error") + .removeClass (errorClass) + .addClass (validClass); + }, + + // submit handler + submitHandler: function (form) { + form.submit (); + } +}; + +//delay time configuration +config.delayTime = 50; + +// chart configurations +config.chart = {}; + +/*********************************************** + * Animation Settings + ***********************************************/ +function animate(options) { + var animationName = "animated " + options.name; + var animationEnd = "webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend"; + $ (options.selector) + .addClass (animationName) + .one (animationEnd, + function () { + $ (this).removeClass (animationName); + } + ); +} + +$ (function () { + var $itemActions = $ (".item-actions-dropdown"); + + $ (document).on ('click', function (e) { + if (!$ (e.target).closest ('.item-actions-dropdown').length) { + $itemActions.removeClass ('active'); + } + }); + + $ ('.item-actions-toggle-btn').on ('click', function (e) { + e.preventDefault (); + + var $thisActionList = $ (this).closest ('.item-actions-dropdown'); + + $itemActions.not ($thisActionList).removeClass ('active'); + + $thisActionList.toggleClass ('active'); + }); +}); + +function setSameHeights($container) { + + $container = $container || $ ('.sameheight-container'); + + var viewport = ResponsiveBootstrapToolkit.current (); + + $container.each (function () { + + var $items = $ (this).find (".sameheight-item"); + + // Get max height of items in container + var maxHeight = 0; + + $items.each (function () { + $ (this).css ({height: 'auto'}); + maxHeight = Math.max (maxHeight, $ (this).innerHeight ()); + }); + + // Set heights of items + $items.each (function () { + // Ignored viewports for item + var excludedStr = $ (this).data ('exclude') || ''; + var excluded = excludedStr.split (','); + + // Set height of element if it's not excluded on + if (excluded.indexOf (viewport) === -1) { + $ (this).innerHeight (maxHeight); + } + }); + }); +} + +$ (function () { + animate ({ + name: 'flipInY', + selector: '.error-card > .error-title-block' + }); + + setTimeout (function () { + var $el = $ ('.error-card > .error-container'); + + animate ({ + name: 'fadeInUp', + selector: $el + }); + + $el.addClass ('visible'); + }, 500); +}); + +$ (function () { + + $ ('#sidebar-menu, #customize-menu').metisMenu ({ + activeClass: 'open' + }); + + $ ('#sidebar-collapse-btn').on ('click', function (event) { + event.preventDefault (); + + $ ("#app").toggleClass ("sidebar-open"); + }); + + $ ("#sidebar-overlay").on ('click', function () { + $ ("#app").removeClass ("sidebar-open"); + }); + +}); +$ (function () { + + $ ('.actions-list > li').on ('click', '.check', function (e) { + e.preventDefault (); + + $ (this).parents ('.tasks-item') + .find ('.checkbox') + .prop ("checked", true); + + // removeActionList (); + }); + +}); + +$ (function () { + $ ('.nav-profile > li > a').on ('click', function () { + var $el = $ (this).next (); + + animate ({ + name: 'flipInX', + selector: $el + }); + }); +}); + +$ (function () { + // Local storage settings + var themeSettings = getThemeSettings (); + + // Elements + + var $app = $ ('#app'); + var $styleLink = $ ('#theme-style'); + var $customizeMenu = $ ('#customize-menu'); + + // Color switcher + var $customizeMenuColorBtns = $customizeMenu.find ('.color-item'); + + // Position switchers + var $customizeMenuRadioBtns = $customizeMenu.find ('.radio'); + + /************************************************ + * Initial State + *************************************************/ + + setThemeSettings (); + + setSameHeights (); + + /************************************************ + * Events + *************************************************/ + + // set theme type + $customizeMenuColorBtns.on ('click', function () { + themeSettings.themeName = $ (this).data ('theme'); + + setThemeSettings (); + }); + + $customizeMenuRadioBtns.on ('click', function () { + + var optionName = $ (this).prop ('name'); + themeSettings[optionName] = $ (this).val (); + + setThemeSettings (); + }); + + function setThemeSettings() { + setThemeState () + .delay (config.delayTime) + .queue (function (next) { + + setThemeColor (); + setThemeControlsState (); + saveThemeSettings (); + + $ (document).trigger ("themechange"); + + next (); + }); + } + + /************************************************ + * Update theme based on options + *************************************************/ + + function setThemeState() { + // set theme type + if (themeSettings.themeName) { + $styleLink.attr ('href', window.cssPath + '/app-' + themeSettings.themeName + '.css'); + } + else { + $styleLink.attr ('href', window.cssPath + '/app.css'); + } + // App classes + $app.removeClass ('header-fixed footer-fixed sidebar-fixed'); + + // set header + $app.addClass (themeSettings.headerPosition); + + // set footer + $app.addClass (themeSettings.footerPosition); + + // set footer + $app.addClass (themeSettings.sidebarPosition); + + return $app; + } + + /************************************************ + * Update theme controls based on options + *************************************************/ + + function setThemeControlsState() { + // set color switcher + $customizeMenuColorBtns.each (function () { + if ($ (this).data ('theme') === themeSettings.themeName) { + $ (this).addClass ('active'); + } + else { + $ (this).removeClass ('active'); + } + }); + + // set radio buttons + $customizeMenuRadioBtns.each (function () { + var name = $ (this).prop ('name'); + var value = $ (this).val (); + + if (themeSettings[name] === value) { + $ (this).prop ("checked", true); + } + else { + $ (this).prop ("checked", false); + } + }); + } + + /************************************************ + * Update theme color + *************************************************/ + function setThemeColor() { + config.chart.colorPrimary = tinycolor ($ref.find (".chart .color-primary").css ("color")); + config.chart.colorSecondary = tinycolor ($ref.find (".chart .color-secondary").css ("color")); + } + + /************************************************ + * Storage Functions + *************************************************/ + + function getThemeSettings() { + var settings = (localStorage.getItem ('themeSettings')) ? JSON.parse (localStorage.getItem ('themeSettings')) : {}; + + settings.headerPosition = settings.headerPosition || ''; + settings.sidebarPosition = settings.sidebarPosition || ''; + settings.footerPosition = settings.footerPosition || ''; + + return settings; + } + + function saveThemeSettings() { + localStorage.setItem ('themeSettings', JSON.stringify (themeSettings)); + } +}); \ No newline at end of file diff --git a/resources/assets/sass/admin/_common/_styles/layout.scss b/resources/assets/sass/admin/_common/_styles/layout.scss index 47b0ec98..a5c1edef 100644 --- a/resources/assets/sass/admin/_common/_styles/layout.scss +++ b/resources/assets/sass/admin/_common/_styles/layout.scss @@ -3,8 +3,8 @@ .row { .col { - padding-left: $grid-gutter-width/2; - padding-right: $grid-gutter-width/2; + padding-left: $grid-gutter-width-base/2; + padding-right: $grid-gutter-width-base/2; float: left; } } diff --git a/resources/assets/sass/admin/_common/items-list.scss b/resources/assets/sass/admin/_common/items-list.scss index dcd99ce7..f0c3bd4a 100644 --- a/resources/assets/sass/admin/_common/items-list.scss +++ b/resources/assets/sass/admin/_common/items-list.scss @@ -1,386 +1,390 @@ @import "../imports"; - - /* ******************************************* * Item List general styles ********************************************** */ .item-list { - list-style: none; - padding: 0; - margin: 0; - margin-bottom: 0; - line-height: $item-list-line-height; - - @include media(lg) { - font-size: 1rem; - } + list-style: none; + padding: 0; + margin: 0; + line-height: $item-list-line-height; - @include media(md) { - font-size: 0.95rem; - } + @include media(lg) { + font-size: 1rem; + } - @include media-down(sm) { - font-size: 1.05rem; - } + @include media(md) { + font-size: 0.95rem; + } - display: flex; - flex-flow: column nowrap; + @include media-down(sm) { + font-size: 1.05rem; + } - &.striped { - & > li { - border-bottom: 1px solid $item-list-color-border; - } - - & > li:nth-child(2n + 1) { - background-color: lighten($color-divider, 12%); - - @include media-down(sm) { - background-color: lighten($color-divider, 11%); - } - } - - .item-list-footer { - border-bottom: none; - } - } + display: flex; + flex-flow: column nowrap; } + .striped { + & > div, & tr { + border-bottom: 1px solid $item-list-color-border; + } + + & > div:nth-child(2n + 1), & tr:nth-child(2n + 1) { + background-color: lighten($color-divider, 12%); + + @include media-down(sm) { + background-color: lighten($color-divider, 11%); + } + } + + .item-list-footer { + border-bottom: none; + } + } /* ******************************************* * Item general styles ********************************************** */ - .item-list { - .item { - display: flex; - flex-direction: column; - } - .item-row { - display: flex; - align-items: stretch; - flex-direction: row; - justify-content: space-between; - flex-wrap: wrap; - min-width: 100%; + .subpage { + padding-left: 35px; + } - &.nowrap { - flex-wrap: nowrap; - } - } + .thumbnail { + width: 100%; + height: 80px; + background-size: cover; + background-repeat: no-repeat; + background-position: center center; + } - .item-col { - align-items: center; - display: flex; - padding: $item-list-padding-y $item-list-padding-x $item-list-padding-y 0; - flex-basis: 0; - flex-grow: $item-list-col-grow; - flex-shrink: $item-list-col-shrink; - margin-left: auto; - margin-right: auto; - min-width: 0; + .item { + display: flex; + flex-direction: column; + } - &.fixed { - flex-grow: 0; - flex-shrink: 0; - flex-basis: auto; - } + .item-row { + display: flex; + align-items: stretch; + flex-direction: row; + justify-content: space-between; + flex-wrap: wrap; + min-width: 100%; - &.pull-left { - margin-right: auto; - } + &.nowrap { + flex-wrap: nowrap; + } + } - &.pull-right { - margin-left: auto; - } + .item-col { + align-items: center; + display: flex; + padding: $item-list-padding-y $item-list-padding-x $item-list-padding-y 0; + flex-basis: 0; + flex-grow: $item-list-col-grow; + flex-shrink: $item-list-col-shrink; + margin-left: auto; + margin-right: auto; + min-width: 0; - & > div { - width: 100%; - } + &.fixed { + flex-grow: 0; + flex-shrink: 0; + flex-basis: auto; + } - &:last-child { - padding-right: 0; - } - } + &.pull-left { + margin-right: auto; + } - .no-overflow { - overflow: hidden; - } + &.pull-right { + margin-left: auto; + } - .no-wrap { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } + & > div { + width: 100%; + } + + &:last-child { + padding-right: 0; + } + } + + .no-overflow { + overflow: hidden; + } + + .no-wrap { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } } - /* ******************************************* * Item components ********************************************** */ - .item-list { - /******************************************** - * Header - *********************************************/ + /******************************************** + * Header + *********************************************/ - .item-list-header { - .item-col.item-col-header { - span { - color: #999; - font-size: 0.8rem; - font-weight: 700 !important; - } - } - } + .item-list-header { + .item-col.item-col-header { + span { + color: #999; + font-size: 0.8rem; + font-weight: 700 !important; + } + } + } - /******************************************** - * Heading - *********************************************/ + /******************************************** + * Heading + *********************************************/ - .item-heading { - font-size: 0.9rem; - display: none; - color: #666; - font-weight: 700; - padding-right: $item-list-padding-x; + .item-heading { + font-size: 0.9rem; + display: none; + color: #666; + font-weight: 700; + padding-right: $item-list-padding-x; - @include media-down(sm) { - display: block; - } + @include media-down(sm) { + display: block; + } - @include media(sm) { - width: 100%; - } + @include media(sm) { + width: 100%; + } - @include media(xs) { - width: 40%; - } - } + @include media(xs) { + width: 40%; + } + } - /******************************************** - * Checkbox - *********************************************/ + /******************************************** + * Checkbox + *********************************************/ - .item-col.item-col-check { - flex-basis: 20px + $item-list-padding-x; + .item-col.item-col-check { + flex-basis: 20px + $item-list-padding-x; - @include media-down(sm) { - order: -8; - } - } + @include media-down(sm) { + order: -8; + } + } - .item-check { - margin-bottom: 0; + .item-check { + margin-bottom: 0; - .checkbox + span { - padding-right: 0; + .checkbox + span { + padding-right: 0; - &:before { - width: 20px; - } - } - } + &:before { + width: 20px; + } + } + } - /******************************************** - * Image - *********************************************/ + /******************************************** + * Image + *********************************************/ - .item-col.item-col-img { - display: flex; - flex-basis: 60px + $item-list-padding-x; + .item-col.item-col-img { + display: flex; + flex-basis: 60px + $item-list-padding-x; - &.xs{ - flex-basis: 30px + $item-list-padding-x; - } + &.xs { + flex-basis: 30px + $item-list-padding-x; + } - &.sm { - flex-basis: 40px + $item-list-padding-x; - } + &.sm { + flex-basis: 40px + $item-list-padding-x; + } - &.lg { - flex-basis: 90px + $item-list-padding-x; - } + &.lg { + flex-basis: 90px + $item-list-padding-x; + } - &.xl { - flex-basis: 110px + $item-list-padding-x; - } + &.xl { + flex-basis: 110px + $item-list-padding-x; + } - a { - width: 100%; - // display: flex; - } - } + a { + width: 100%; + // display: flex; + } + } - .item-img { - flex-grow: 1; - align-self: stretch; - background-color: #efefef; - padding-bottom: 100%; - width: 100%; - height: 0; + .item-img { + flex-grow: 1; + align-self: stretch; + background-color: #EFEFEF; + padding-bottom: 100%; + width: 100%; + height: 0; - @include bg-cover(); - } + @include bg-cover(); + } - /******************************************** - * Title - *********************************************/ + /******************************************** + * Title + *********************************************/ - .item-col.item-col-title { + .item-col.item-col-title { - @include media-down(sm) { - order: -4; - } + @include media-down(sm) { + order: -4; + } - a { - display: block; - } - } + a { + display: block; + } + } - .item-title { - margin: 0; - font-size: inherit; - line-height: inherit; - font-weight: 600; - } + .item-title { + margin: 0; + font-size: inherit; + line-height: inherit; + font-weight: 600; + } - /******************************************** - * Stats - *********************************************/ + /******************************************** + * Stats + *********************************************/ - .item-stats { - height: $item-list-line-height; - } + .item-stats { + height: $item-list-line-height; + } - /******************************************** - * Actions - *********************************************/ + /******************************************** + * Actions + *********************************************/ - .item-col.item-col-actions-dropdown { - flex-basis: 30px + $item-list-padding-x; - text-align: center; - padding-left: 0 !important; + .item-col.item-col-actions-dropdown { + flex-basis: 30px + $item-list-padding-x; + text-align: center; + padding-left: 0 !important; - @include media-down(sm) { - order: -3; + @include media-down(sm) { + order: -3; - flex-basis: 30px + $item-list-padding-x !important; - padding-right: $item-list-padding-x; - } - } + flex-basis: 30px + $item-list-padding-x !important; + padding-right: $item-list-padding-x; + } + } - .item-actions-dropdown { - position: relative; - font-size: 1.1rem; + .item-actions-dropdown { + position: relative; + font-size: 1.1rem; - &.active { - .item-actions-block { - max-width: 120px; - } + &.active { + .item-actions-block { + max-width: 120px; + } - .item-actions-toggle-btn { - color: $color-primary; + .item-actions-toggle-btn { + color: $color-primary; - .active { - display: block; - } + .active { + display: block; + } - .inactive { - display: none; - } - } - } + .inactive { + display: none; + } + } + } - .item-actions-toggle-btn { - color: lighten($color-text-light, 10); - font-size: 1.2rem; - cursor: pointer; - width: 100%; - line-height: 30px; - text-align: center; - text-decoration: none; + .item-actions-toggle-btn { + color: lighten($color-text-light, 10); + font-size: 1.2rem; + cursor: pointer; + width: 100%; + line-height: 30px; + text-align: center; + text-decoration: none; - .active { - display: none; - } - } + .active { + display: none; + } + } - .item-actions-block { - height: 30px; - max-width: 0px; - line-height: 30px; - overflow: hidden; - position: absolute; - top: 0; - right: 100%; - background-color: $color-divider; - border-radius: 3px; - transition: all 0.15s ease-in-out; + .item-actions-block { + height: 30px; + max-width: 0px; + line-height: 30px; + overflow: hidden; + position: absolute; + top: 0; + right: 100%; + background-color: $color-divider; + border-radius: 3px; + transition: all 0.15s ease-in-out; - &.direction-right { - right: auto; - left: 100%; - } + &.direction-right { + right: auto; + left: 100%; + } + .item-actions-list { + padding: 0; + list-style: none; + white-space: nowrap; + padding: 0 5px; - .item-actions-list { - padding: 0; - list-style: none; - white-space: nowrap; - padding: 0 5px; + li { + display: inline-block; + padding: 0; + } - li{ - display: inline-block; - padding: 0; - } + a { + display: block; + padding: 0 5px; - a { - display: block; - padding: 0 5px; + &.edit { + color: #38424C; + } - &.edit { - color: #38424C; - } + &.check { + color: #40B726; + } - &.check { - color: #40B726; - } + &.remove { + color: #DB0E1E; + } + } + } + } - &.remove { - color: #DB0E1E; - } - } - } - } + } - } - - /******************************************** - * Something else? - *********************************************/ + /******************************************** + * Something else? + *********************************************/ } - /* ******************************************* * Adjustments ********************************************** */ // Item which is located inside card inside item-list .card > .item-list .item > .item-row { - padding: 0 $card-padding-x; + padding: 0 $card-padding-x; - @include media(xl) { - padding: 0 $card-padding-x-xl; - } + @include media(xl) { + padding: 0 $card-padding-x-xl; + } - @include media-down(sm) { - padding: 0 $card-padding-x-sm; - } + @include media-down(sm) { + padding: 0 $card-padding-x-sm; + } } \ No newline at end of file diff --git a/resources/assets/sass/admin/app/items/list/items-list.scss b/resources/assets/sass/admin/app/items/list/items-list.scss index bd9eb441..c5fff005 100644 --- a/resources/assets/sass/admin/app/items/list/items-list.scss +++ b/resources/assets/sass/admin/app/items/list/items-list.scss @@ -1,5 +1,9 @@ @import "../../../imports"; +.item-list { + +} + .items-list-page { .title-search-block { @@ -313,12 +317,7 @@ text-align: left; } - } - - } } - - } \ No newline at end of file diff --git a/resources/lang/cs/admin/actionLog.php b/resources/lang/cs/admin/actionLog.php index 66fd4f6d..75b32942 100644 --- a/resources/lang/cs/admin/actionLog.php +++ b/resources/lang/cs/admin/actionLog.php @@ -1,51 +1,53 @@ "Přiřadil widget :widgetName (#:widgetId) do plochy :widgetAreaName (#:widgetAreaId)", - "changeSettings" => "Změna nastavení", - "createNewContent" => "Vytvořena nová obsahová stránka. Titulek :title, url :url a ID #:id", - "createUser" => "Vytvořen nový uživatel :name s e-mailem :email.", - "deleteContent" => 'Smazána stránka ":title", url "url a ID #:id. Tato změna je zaznamenána v revizi :revision.', - "deleteCustomField" => "a", - "deleteWidgetArea" => "Smazal plochu pro widget :name", - "displayingUsersActions" => "Zobrazuji všechny akce od uživatele :name (:email).", - "draftFromContent" => "Upraven widget :name (#:id)", - "editContent" => 'Editace stránky - nový titulek je ":title", url :url a ID #:id. Revize změny: :revision.', - "editCustomField" => "a", - "editWidget" => "Upraven widget :name (#:id)", - "editWidgetArea" => 'Upravena plocha pro widgety :name (#:id) s popisem ":description"', - "invalidEditContentAttempt" => "Pokus o editaci obsahu s ID :contentId", - "ip" => "IP adresa", - "login" => "Přihlášen", - "logout" => "Odhlášen", - "nameAssignWidget" => "Přiřazení widgetu", - "nameChangeSettings" => "Změna nastavení", - "nameCreateNewContent" => "Vytvoření nové stránky", - "nameCreateUser" => "Vytvořen uživatel", - "nameDeleteContent" => "Smazání stránky", - "nameDeleteCustomField" => "Smazání uživatelského pole", - "nameDeleteWidgetArea" => "Smazání plochy pro widgety", - "nameDraftFromContent" => "Vytvoření konceptu z publikované stránky", - "nameEditContent" => "Úprava obsahu", - "nameEditCustomField" => "Editace uživatelského pole", - "nameEditWidget" => "Úprava widgetu", - "nameEditWidgetArea" => "Úprava plochy pro widgety", + "assignWidget" => "Přiřadil widget :widgetName (#:widgetId) do plochy :widgetAreaName (#:widgetAreaId)", + "changeSettings" => "Změna nastavení", + "createNewContent" => "Vytvořena nová obsahová stránka. Titulek :title, url :url a ID #:id", + "createUser" => "Vytvořen nový uživatel :name s e-mailem :email.", + "deleteContent" => 'Smazána stránka ":title", url "url a ID #:id. Tato změna je zaznamenána v revizi :revision.', + "deleteCustomField" => "a", + "deleteWidgetArea" => "Smazal plochu pro widget :name", + "displayingUsersActions" => "Zobrazuji všechny akce od uživatele :name (:email).", + "draftFromContent" => "Upraven widget :name (#:id)", + "editContent" => 'Editace stránky - nový titulek je ":title", url :url a ID #:id. Revize změny: :revision.', + "editCustomField" => "a", + "editWidget" => "Upraven widget :name (#:id)", + "editWidgetArea" => 'Upravena plocha pro widgety :name (#:id) s popisem ":description"', + "invalidEditContentAttempt" => "Pokus o editaci obsahu s ID :contentId", + "ip" => "IP adresa", + "login" => "Přihlášen", + "logout" => "Odhlášen", + "nameAssignWidget" => "Přiřazení widgetu", + "nameChangeSettings" => "Změna nastavení", + "nameCreateNewContent" => "Vytvoření nové stránky", + "nameCreateUser" => "Vytvořen uživatel", + "nameDeleteContent" => "Smazání stránky", + "nameDeleteCustomField" => "Smazání uživatelského pole", + "nameDeleteWidgetArea" => "Smazání plochy pro widgety", + "nameDraftFromContent" => "Vytvoření konceptu z publikované stránky", + "nameEditContent" => "Úprava obsahu", + "nameEditCustomField" => "Editace uživatelského pole", + "nameEditWidget" => "Úprava widgetu", + "nameEditWidgetArea" => "Úprava plochy pro widgety", "nameInvalidEditContentAttempt" => "Pokus o editaci neexistující/neplatné stránky", - "nameLogin" => "Login", - "nameLogout" => "Odhlášení", - "nameNewCustomField" => "Vytvoření uživatelského pole", - "nameNewWidget" => "Nový widget", - "nameNewWidgetArea" => "Vytoření plochy pro widgety", - "namePublishContent" => "Publikace stránky", - "nameRemoveWidgetFromArea" => "Odebrání widgetu z plochy", - "nameSetHomepage" => "Nastavení domovské stránky", - "nameUserEdit" => "Editace uživatele", - "newCustomField" => 'Přidal nové uživatelské pole s ID #:id a jménem ":name"', - "newWidget" => 'Vytvořen nový widget :type se jménem :name (#:id) a popisem ":description".', - "newWidgetArea" => 'Vytvořil plochu pro widgety :name (#:id) s popisem ":description"', - "overview" => "Seznam všech akcí", - "publishContent" => 'Publikována stránka ":title" (url :url, ID #:id). Revize :revision.', - "removeWidgetFromArea" => "Odebrán widget :widgetName z oblasti :widgetAreaName (#widgetAreaId)", - "setHomepage" => "Nastavena nová domovská stránka: :title, URL: :url a ID #:id. Revize :revision.", - "userAgent" => "Prohlížeč", - "userEdit" => "Upravil uživatele :name (:email)", + "nameLogin" => "Login", + "nameLogout" => "Odhlášení", + "nameNewCustomField" => "Vytvoření uživatelského pole", + "nameNewWidget" => "Nový widget", + "nameNewWidgetArea" => "Vytoření plochy pro widgety", + "namePublishContent" => "Publikace stránky", + "nameRemoveWidgetFromArea" => "Odebrání widgetu z plochy", + "nameSetHomepage" => "Nastavení domovské stránky", + "nameUserEdit" => "Editace uživatele", + "newCustomField" => 'Přidal nové uživatelské pole s ID #:id a jménem ":name"', + "newWidget" => 'Vytvořen nový widget :type se jménem :name (#:id) a popisem ":description".', + "newWidgetArea" => 'Vytvořil plochu pro widgety :name (#:id) s popisem ":description"', + "overview" => "Seznam všech akcí", + "publishContent" => 'Publikována stránka ":title" (url :url, ID #:id). Revize :revision.', + "removeWidgetFromArea" => "Odebrán widget :widgetName z oblasti :widgetAreaName (#widgetAreaId)", + "setHomepage" => "Nastavena nová domovská stránka: :title, URL: :url a ID #:id. Revize :revision.", + "userAgent" => "Prohlížeč", + "userEdit" => "Upravil uživatele :name (:email)", + 'newFile' => 'Nahrál soubor :name (typ :mime)', + 'nameNewFile' => 'Nahrání souboru' ]; diff --git a/resources/lang/cs/admin/common.php b/resources/lang/cs/admin/common.php index 6f0180de..a8cc3e2c 100644 --- a/resources/lang/cs/admin/common.php +++ b/resources/lang/cs/admin/common.php @@ -7,5 +7,6 @@ return [ "logoutSuccessfull" => "Odhlášení proběhlo úspěšně", "no" => "Ne", "yes" => "Ano", - 'empty' => 'Žádná data nebyla nalezena.' + 'empty' => 'Žádná data nebyla nalezena.', + "noSearchEngine" => 'Není dostupný žádný vyhledávač.' ]; diff --git a/resources/lang/cs/admin/contents.php b/resources/lang/cs/admin/contents.php index f4ce8ddd..1e84ba2a 100644 --- a/resources/lang/cs/admin/contents.php +++ b/resources/lang/cs/admin/contents.php @@ -35,10 +35,10 @@ return [ "noHomepage" => "Domovská stránka není nastavena (a nebo je nastavena jako Koncept)! Vyberte prosím jinou stránku, nebo stávající publikujte.", "noPagesAvailable" => "Nejsou dostupné žádné stránky. Pro zobrazení přehledu nejprve nějakou vytvořte.", "noParentPage" => "-- Nadřazená stránka nevybrána --", - "noTemplates" => "Nelze vytvořit stránku. Pro tento modul neexistuje žádná šablona, která by šla použít pro vykreslení obsahu.", + "noTemplates" => "Pro tento modul neexistuje žádná šablona, která by šla použít pro vykreslení obsahu. Nebude možné tuto stránku zobrazit!", "nothingToEdit" => "Nebyly provedeny žádné změny, proto nedošlo k editaci.", "overview" => "Seznam všech obsahových stránek", - "pageDeleted" => "Stránka :name (:url) úspěšně smazána.", + "pageDeleted" => "Stránka :name úspěšně smazána.", "parentPage" => "Nadřazená stránka", "publicationOptions" => "Nastavení publikace", "save" => "Uložit", @@ -56,4 +56,6 @@ return [ "title" => "Titulek", "uploadTitleImage" => "Nahrát titulní obrázek", "viewPage" => "Zobrazit", + 'setOrder' => 'Nastavení pořadí stránek', + 'orderSuccessfullySet' => 'Pořadí stránek úspěšně nastaveno', ]; diff --git a/resources/lang/cs/admin/history.php b/resources/lang/cs/admin/history.php index f0191438..72ed3fa5 100644 --- a/resources/lang/cs/admin/history.php +++ b/resources/lang/cs/admin/history.php @@ -6,7 +6,7 @@ return [ "changedFromTo" => "Změna z :from na :to", "columnCategory" => "Kategorie", "columnFile" => "Přiřazené soubory", - "columnIs_homepage" => "Domovská stránka", + "columnIsHomepage" => "Domovská stránka", "columnMetaDescription" => "Popis", "columnMetaKeywords" => "Klíčová slova", "columnPageContent" => "Obsah stránky", @@ -14,6 +14,7 @@ return [ "columnStatus" => "Viditelnost stránky", "columnTemplate" => "Šablona", "columnTitle" => "Titulek", + "columnTitlePhoto" => "Titulní obrázek", "columnTitlePhotoFilename" => "Titulní obrázek", "columnUrl" => "URL", "deletedFile" => "Odebrán soubor :file.", diff --git a/resources/lang/cs/admin/loginForm.php b/resources/lang/cs/admin/loginForm.php index bc8dec7a..d6236905 100644 --- a/resources/lang/cs/admin/loginForm.php +++ b/resources/lang/cs/admin/loginForm.php @@ -10,4 +10,6 @@ return [ 'loginToContinue' => 'Pro vstup je nutné přihlášení', 'yourEmail' => 'Váš e-mail', 'yourPassword' => 'Vaše heslo', + 'sendConfirmEmail' => 'Odeslat odkaz pro resetování hesla', + 'passwordReset' => 'Nové heslo' ]; diff --git a/resources/lang/cs/admin/mainMenu.php b/resources/lang/cs/admin/mainMenu.php index 5fa6e0ac..595883d3 100644 --- a/resources/lang/cs/admin/mainMenu.php +++ b/resources/lang/cs/admin/mainMenu.php @@ -27,4 +27,6 @@ return [ "widgetAreas" => "Plochy pro widgety", "widgets" => "Widgety", "widgetsOverview" => "Všechny widgety", + 'permissions' => 'Přístupová práva', + 'contentOrder' => 'Pořadí stránek' ]; diff --git a/resources/lang/cs/admin/permissions.php b/resources/lang/cs/admin/permissions.php new file mode 100644 index 00000000..b45b9125 --- /dev/null +++ b/resources/lang/cs/admin/permissions.php @@ -0,0 +1,69 @@ + 'Výchozí oprávnění úspěšně nastavena.', + 'pageTitle' => 'Nastavení výchozích oprávnění', + 'description' => 'Nastavte výchozí oprávnění, která budou přidělena nově vytvořeným uživatelům.', + 'successfullySet' => 'Oprávnění úspěšně nastavena.', + 'contents' => [ + 'management' => 'Správa obsahu', + 'create' => 'Vytvořit novou stránku', + 'update' => 'Upravovat své stránky', + 'update-all' => 'Upravovat i cizí stránky', + 'delete' => 'Mazat', + 'set-homepage' => 'Nastavovat domovskou stránku', + 'publish' => 'Publikovat', + 'protect' => 'Publikovat jen pro přihlášené', + 'draft' => 'Skrýt publikovanou stránku', + 'view-history' => 'Zobrazit historii', + ], + 'users' => [ + 'management' => 'Správa uživatelů', + 'create' => 'Vytvořit nového uživatele', + 'update' => 'Upravovat ostatní uživatele', + 'block' => 'Zablokovat', + 'delete' => 'Mazat', + 'unblock' => 'Odblokovat', + 'set-permissions' => 'Nastavovat oprávnění', + 'change-role' => 'Změnit roli', + 'change-status' => 'Změnit status uživatele (zablokovat/odblokovat)' + ], + 'files' => [ + 'management' => 'Správa souborů', + 'upload' => 'Nahrávání', + 'update' => 'Úprava', + 'delete' => 'Mazání', + 'move-to-directories' => 'Přesouvat soubory mezi adresáři' + ], + 'directories' => [ + 'management' => 'Správa složek', + 'create' => 'Vytváření', + 'edit' => 'Úprava', + 'delete' => 'Mazání' + ], + 'widgetareas' => [ + 'management' => 'Správa ploch pro widgety', + 'create' => 'Vytváření', + 'edit' => 'Úprava', + 'delete' => 'Mazání' + ], + 'widgets' => [ + 'management' => 'Správa widgetů', + 'create' => 'Vytváření', + 'edit' => 'Úprava', + 'delete' => 'Mazání', + 'assign' => 'Přiřazování widgetů do plochy', + 'unassign' => 'Odstraňování widgetů z plochy' + ], + 'templates' => [ + 'management' => 'Správa šablon', + 'copy' => 'Kopírování', + 'edit' => 'Úprava', + ], + 'actions' => [ + 'management' => 'Zobrazení přehledu akcí', + ], + 'settings' => [ + 'management' => 'Správa nastavení', + ], + 'save' => 'Uložit výchozí nastavení' +]; \ No newline at end of file diff --git a/resources/lang/cs/admin/settings.php b/resources/lang/cs/admin/settings.php index 4e1ed5ab..e4043ed2 100644 --- a/resources/lang/cs/admin/settings.php +++ b/resources/lang/cs/admin/settings.php @@ -21,4 +21,21 @@ return [ ], "socialSites" => "Sociální sítě", "successfullySaved" => "Nastavení úspěšně změněno", + 'advanced' => [ + "title" => 'Pokročilé', + ], + + 'previews' => [ + 'title' => 'Nastavení obrázkových náhledů', + 'quality' => 'Kvalita', + 'size' => 'Velikost (v pixelech)' + ], + + 'widgets' => [ + 'title' => 'Widgety', + 'useWidgetPreloading' => 'Používat přednačítání widgetů?', + 'preloadFrequentedWidgetAreasTreshold' => 'Práh pro přednačtení widgetů', + 'widgetCacheLifetime' => 'Platnost cache pro widgety' + ] + ]; diff --git a/resources/lang/cs/admin/templates.php b/resources/lang/cs/admin/templates.php index 6256abf6..060179da 100644 --- a/resources/lang/cs/admin/templates.php +++ b/resources/lang/cs/admin/templates.php @@ -1,23 +1,27 @@ "Adresář nemá potřebná práva k zápisu. Kopírování není dostupné.", - "cannotWriteContent" => "Nelze uložit obsah šablony, adresář pro uložení souboru nemá dostatečná oprávnění pro zápis. Meta informace k šabloně však byly uloženy.", - "copyFailed" => "Nelze zkopírovat šablonu do :name. Zkontrolujte prosím právo pro zápis do adresáře s šablonami.", - "copySuccessfull" => "Šablona :name úspěšně vytvořena zkopírováním z jiné šablony", - "core" => "Společné šablony", - "description" => "Popis", - "edit" => "Úprava šablony :name", - "editSuccessfull" => "Šablona úspěšně uložena", - "error" => "Šablony pro zobrazení chyb", - "homepage" => "Domovská stránka", - "name" => "Jméno šablony", - "new" => "Nová šablona", - "newTemplateName" => "Jméno šablony použité v Blade šablonách", + "copy" => 'Kopírovat šablonu', + "cannotCopy" => "Adresář nemá potřebná práva k zápisu. Kopírování není dostupné.", + "cannotWriteContent" => "Nelze uložit obsah šablony, adresář pro uložení souboru nemá dostatečná oprávnění pro zápis. Meta informace k šabloně však byly uloženy.", + "copyFailed" => "Nelze zkopírovat šablonu do :name. Zkontrolujte prosím právo pro zápis do adresáře s šablonami.", + "copySuccessfull" => "Šablona :name úspěšně vytvořena zkopírováním z jiné šablony", + "core" => "Společné šablony", + "description" => "Popis", + "edit" => "Úprava šablony :name", + "editSuccessfull" => "Šablona úspěšně uložena", + "error" => "Šablony pro zobrazení chyb", + "homepage" => "Domovská stránka", + "name" => "Jméno šablony", + "new" => "Nová šablona", + "newTemplateName" => "Jméno šablony použité v Blade šablonách", "newTemplateNameSuffix" => "kopie", - "noSubdirectories" => "Nejsou k dispozici žádné podadresáře", - "noTemplates" => "Žádná šablona k dispozici", - "notWritable" => "Nelze zapisovat do :file. Veškeré úpravy na tomto soubory nebudou uloženy!", - "overview" => "Šablony", - "parentDirectory" => "Rodičovský adresář", - "subdirectories" => "Podadresáře", + "noSubdirectories" => "Nejsou k dispozici žádné podadresáře", + "noTemplates" => "Žádná šablona k dispozici", + "notWritable" => "Nelze zapisovat do :file. Veškeré úpravy na tomto soubory nebudou uloženy!", + "overview" => "Šablony", + "parentDirectory" => "Rodičovský adresář", + "subdirectories" => "Podadresáře", + 'widgets' => 'Widgety', + 'errors' => 'Chybové stránky', + 'contact' => 'Kontaktní formulář' ]; diff --git a/resources/lang/cs/admin/userManagement.php b/resources/lang/cs/admin/userManagement.php index 0cec8e24..ec7e6a7e 100644 --- a/resources/lang/cs/admin/userManagement.php +++ b/resources/lang/cs/admin/userManagement.php @@ -1,32 +1,32 @@ "Přidat nového uživatele", - "allStatuses" => "Všechny", - "detail" => "Detaily uživatele :name (:email)", - "edit" => "Upravit uživatele", - "editUser" => "Editace uživatele :name (:email)", - "email" => "E-mail", - "gravatarLink" => 'Nastavte si avatar na gravatar.com', - "moreUserActions" => "Zobrazit více...", - "name" => "Celé jméno", - "noActions" => "Uživatel zatím v systému nic neudělal.", - "noUsers" => "Žádní uživatelé.", - "overview" => "Seznam všech uživatelů", - "password" => "Heslo", - "passwordLeaveEmpty" => "Nevyplňujte, pokud nechcete změnit heslo.", - "profile" => "Profil uživatele", - "register" => "Vytvořit uživatele", + "addNewUser" => "Přidat nového uživatele", + "allStatuses" => "Všechny", + "detail" => "Detaily uživatele :name (:email)", + "edit" => "Upravit uživatele", + "editUser" => "Editace uživatele :name (:email)", + "email" => "E-mail", + "gravatarLink" => 'Nastavte si avatar na gravatar.com', + "moreUserActions" => "Zobrazit více...", + "name" => "Celé jméno", + "noActions" => "Uživatel zatím v systému nic neudělal.", + "noUsers" => "Žádní uživatelé.", + "overview" => "Seznam všech uživatelů", + "password" => "Heslo", + "passwordLeaveEmpty" => "Nevyplňujte, pokud nechcete změnit heslo.", + "profile" => "Profil uživatele", + "register" => "Vytvořit uživatele", "registrationSuccessfull" => "Nový úživatel úspěšně přidán.", - "role_admin" => "Administrátor", - "role_editor" => "Editor", - "role_visitor" => "Návštěvník", - "roles" => "Prosím, zvolte roli uživatele", - "status" => "Stav", - "status_active" => "Aktivní", - "status_blocked" => "Zablokovaný", - "status_deleted" => "Smazaný", - "update" => "Upravit informace", - "userDetail" => "Informace", - "userSuccessfullyEdited" => "Uživatel úspěšně upraven.", - "usersActions" => "Akce uživatele", + "role_admin" => "Uživatel s přístupem do administrace", + "role_visitor" => "Návštěvník (bez přístupu do administrace)", + "roles" => "Prosím, zvolte roli uživatele", + "status" => "Stav", + "status_active" => "Aktivní", + "status_blocked" => "Zablokovaný", + "status_deleted" => "Smazaný", + "update" => "Upravit informace", + "userDetail" => "Informace", + "userSuccessfullyEdited" => "Uživatel úspěšně upraven.", + "usersActions" => "Akce uživatele", + 'permissions' => 'Oprávnění' ]; diff --git a/resources/lang/cs/admin/widgetAreas.php b/resources/lang/cs/admin/widgetAreas.php index c601cf81..912cefaa 100644 --- a/resources/lang/cs/admin/widgetAreas.php +++ b/resources/lang/cs/admin/widgetAreas.php @@ -20,4 +20,5 @@ return [ "successfullyCreated" => "Plocha pro widgety úspěšně vytvořena", "successfullyDeleted" => "Úspěšně smazáno", "uniqueCode" => "Unikátní kód", + 'pageDescription' => 'Plochy pro widgety jsou oblasti, do kterých je možné přiřadit widgety a následně je zobrazovat na webu.' ]; diff --git a/resources/lang/cs/auth.php b/resources/lang/cs/auth.php index 3c6641c8..e27fa692 100644 --- a/resources/lang/cs/auth.php +++ b/resources/lang/cs/auth.php @@ -1,6 +1,9 @@ "Nelze přistoupit k tomuto zdroji", - "failed" => "Přihlašovací údaje nejsou správné.", - "throttle" => "Příliš mnoho neplatných přihlášení. Zkuste to znovu za :seconds sekund.", + "accessDenied" => "Nelze přistoupit k tomuto zdroji", + "failed" => "Přihlašovací údaje nejsou správné.", + "throttle" => "Příliš mnoho neplatných přihlášení. Zkuste to znovu za :seconds sekund.", + 'userNotActive' => 'Uživatel nebyl aktivován, či byl administrátorem zablokován.', + 'visitorInAdmin' => 'Návštěvník nemá oprávnění do adminstrace!', + 'loginExpired' => 'Vaše přihlášení expirovalo. Přihlašte se prosím znovu.' ]; diff --git a/resources/lang/cs/common.php b/resources/lang/cs/common.php index 763c5c6c..2a258214 100644 --- a/resources/lang/cs/common.php +++ b/resources/lang/cs/common.php @@ -28,5 +28,7 @@ return [ "positionStatic" => "statické", "sidebar" => "Sidebar", 'no' => 'Ne', - 'yes' => 'Ano' + 'yes' => 'Ano', + 'minutes' => 'minut', + 'views' => 'zobrazení' ]; diff --git a/resources/lang/cs/notification.php b/resources/lang/cs/notification.php new file mode 100644 index 00000000..d79ea618 --- /dev/null +++ b/resources/lang/cs/notification.php @@ -0,0 +1,9 @@ + [ + 'firstLine' => 'Dostali jste tento e-mail, protože byl zaslán požadavek na reset hesla. Pro nastavení nového hesla klikněte na následující tlačítko:', + 'lastLine' => 'V případě, že tento e-mail neočekáváte, můžete ho klidně ignorovat.', + 'button' => 'Resetovat heslo', + 'subject' => 'Odkaz pro změnu hesla' + ] +]; \ No newline at end of file diff --git a/resources/lang/cs/register.php b/resources/lang/cs/register.php new file mode 100644 index 00000000..38d8ec29 --- /dev/null +++ b/resources/lang/cs/register.php @@ -0,0 +1,10 @@ + 'Registrace nového uživatele', + 'name' => 'Jméno', + 'email' => 'E-mail', + 'password' => 'Heslo', + 'passwordConfirm' => 'Heslo (znovu)', + 'register' => 'Vytvořit účet', + 'setNewPassword' => 'Nastavit nové heslo' +]; \ No newline at end of file diff --git a/resources/lang/cs/widgets/common.php b/resources/lang/cs/widgets/common.php index 5d545038..49bf9a4d 100644 --- a/resources/lang/cs/widgets/common.php +++ b/resources/lang/cs/widgets/common.php @@ -1,9 +1,10 @@ "HTML třída použitá pro obalový element widgetu", - "containerId" => "Unikátní ID widgetu (může být i prázdné)", - "description" => "Popis", - "edit" => "Upravuji widget :name", - "name" => "Jméno", - "new" => "Vytvořit nový widget" +"containerClass" => "HTML třída použitá pro obalový element widgetu", +"containerId" => "Unikátní ID widgetu (může být i prázdné)", +"description" => "Popis", +"edit" => "Upravuji widget :name", +"name" => "Jméno", +"new" => "Vytvořit nový widget", +"widgetDescription" => "Jednoduchý widget pro vkládání HTML kódů.", ]; diff --git a/resources/lang/cs/widgets/orbitSlider.php b/resources/lang/cs/widgets/orbitSlider.php deleted file mode 100644 index 3ac4aab9..00000000 --- a/resources/lang/cs/widgets/orbitSlider.php +++ /dev/null @@ -1,21 +0,0 @@ - "Dodatečný HTML/JS kód pro slider", -"containerClass" => "HTML třída pro obalový element tohoto widgetu", -"createNew" => "Vytvořit nový", -"description" => "Popis", -"displayBullets" => "Zobrazit odrážky?", -"edit" => "Upravit :name", -"editExisting" => "Uložit", -"extraSettings" => "Další nastavení", -"fullscreen" => "Zobrazit slider na celou obrazovku", -"imagesPerSlide" => "Obrázků na slide", -"name" => "Jméno slideru", -"new" => "Vytvořit nový slider", -"preview" => "Náhled", -"showInFullscreen" => "Zobrazit na celou obrazovku", -"slideContainerClass" => "HTML třída pro každý obrázek ve slideru", -"upload" => "Přidat obrázky do slideru", -"widgetDescription" => "Slider pro obrázky. Tento widget používá Foundation framework a jeho vlastní slider zvaný Orbit. (Nebude fungovat bez Foundation 6!)", -"widgetName" => "Orbit slider", -]; diff --git a/resources/lang/cs/widgets/socialButtons.php b/resources/lang/cs/widgets/socialButtons.php new file mode 100644 index 00000000..987ef446 --- /dev/null +++ b/resources/lang/cs/widgets/socialButtons.php @@ -0,0 +1,16 @@ + "HTML kod", +"containerClass" => "HTML třída pro obalový element tohoto widgetu", +"createNew" => "Vytvořit nový widget", +"description" => "Popis", +"edit" => "Edituji widget :name", +"editExisting" => "Upravit widget", +"name" => "Jméno", +"new" => "Vytvořit nový widget", +"preview" => "Náhled", +"save" => "Uložit", +"successfullyEdited" => "Widget úspěšně upraven", +"widgetDescription" => "Jednoduchý widget pro vkládání sociálních tlačítek.", +"widgetName" => "Sociální tlačítka", +]; diff --git a/resources/views/admin/content/_partials/orderSetupRow.blade.php b/resources/views/admin/content/_partials/orderSetupRow.blade.php new file mode 100644 index 00000000..db691d26 --- /dev/null +++ b/resources/views/admin/content/_partials/orderSetupRow.blade.php @@ -0,0 +1,16 @@ + + + + + + + + + @include('admin.snippets.hasError', ['field' => 'page['.$page->id.']']) + + + \ No newline at end of file diff --git a/resources/views/admin/content/_partials/overviewRow.blade.php b/resources/views/admin/content/_partials/overviewRow.blade.php new file mode 100644 index 00000000..12ed6919 --- /dev/null +++ b/resources/views/admin/content/_partials/overviewRow.blade.php @@ -0,0 +1,137 @@ +
    + +
    + @can('update', $page) + + {{$page->title}} + + @else + {{$page->title}} + @endcan + + + @if($page->isHomepage) @lang('admin/contents.homepage') @endif +
    +
    + {{$statuses[$page->status]}} +
    +
    + + @lang($page->module->name) + +
    + ({{$page->templateModel->name}}) +
    +
    @date($page->created_at)
    +
    +
    + + + + + + + + +
    +
      + + @if(!$page->isHomepage) + @can('set-homepage', $page) +
    • + + + +
    • + @endcan + @endif + + @can('update', $page) +
    • + + + +
    • + @endcan + + @if($page->isDraft()) + @can('publish', $page) +
    • + + + +
    • + @endcan + @can('protect', $page) +
    • + + + +
    • + @endcan + @else +
    • + + +
    • + @can('draft', $page) +
    • + + + +
    • + @endcan + @endif + + @can('delete', $page) +
    • + + +
    • + @endcan + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/resources/views/admin/content/edit.blade.php b/resources/views/admin/content/edit.blade.php index ba31fe6c..49bdee65 100644 --- a/resources/views/admin/content/edit.blade.php +++ b/resources/views/admin/content/edit.blade.php @@ -21,9 +21,12 @@ @if ($historySize > 0) - + @can('viewHistory', $page) + + @endcan @endif diff --git a/resources/views/admin/content/formParts/appearance.blade.php b/resources/views/admin/content/formParts/appearance.blade.php index 341a5ca3..e9991903 100644 --- a/resources/views/admin/content/formParts/appearance.blade.php +++ b/resources/views/admin/content/formParts/appearance.blade.php @@ -4,25 +4,30 @@ class="col-lg-4 col-lg-offset-4 col-md-6 col-md-offset-3 col-sm-12 title-photo text-center">

    -

    - -

    + @can('upload', \App\Models\FileManager\File::class) +

    + +

    + @endcan @endif -
    -
    - - +@can('upload', \App\Models\FileManager\File::class) +
    +
    + + - @include('admin.snippets.hasError', ['field' => 'titlePhotoFile']) + @include('admin.snippets.hasError', ['field' => 'titlePhotoFile']) +
    -
    +@endcan @if (count($templates))
    diff --git a/resources/views/admin/content/formParts/publicationSetup.blade.php b/resources/views/admin/content/formParts/publicationSetup.blade.php index 62725948..479a07ff 100644 --- a/resources/views/admin/content/formParts/publicationSetup.blade.php +++ b/resources/views/admin/content/formParts/publicationSetup.blade.php @@ -5,7 +5,7 @@ + placeholder="@lang('admin/contents.field_published_from')" /> @include('admin.snippets.hasError', ['field' => 'publishedFrom'])
    @@ -16,7 +16,7 @@ + placeholder="@lang('admin/contents.field_published_to')" /> @include('admin.snippets.hasError', ['field' => 'publishedTo'])
    \ No newline at end of file diff --git a/resources/views/admin/content/new.blade.php b/resources/views/admin/content/new.blade.php index fc2a5996..e2d3e58f 100644 --- a/resources/views/admin/content/new.blade.php +++ b/resources/views/admin/content/new.blade.php @@ -10,7 +10,7 @@ @endif -
    + {!! csrf_field() !!} @include('admin.content.formInputs') diff --git a/resources/views/admin/content/order.blade.php b/resources/views/admin/content/order.blade.php new file mode 100644 index 00000000..ec5db2bd --- /dev/null +++ b/resources/views/admin/content/order.blade.php @@ -0,0 +1,39 @@ +@extends('admin.layoutWithNavigation') + +@section('pageHeading', trans('admin/contents.setOrder')) + +@section('content') + + @if (count($pages) > 0) +
    +
    + + {!! csrf_field() !!} + + + @foreach($pages as $page) + @include('admin.content._partials.orderSetupRow') + + @foreach($page->subpages as $subpage) + @include('admin.content._partials.orderSetupRow', ['page' => $subpage, 'extraClass' => 'subpage']) + @endforeach + @endforeach +
    + + + + +
    + + +
    + + + @else +
    + @lang('admin/contents.noPagesAvailable') +
    + @endif +@endsection diff --git a/resources/views/admin/content/overview.blade.php b/resources/views/admin/content/overview.blade.php index 24d5f3b9..84c21fde 100644 --- a/resources/views/admin/content/overview.blade.php +++ b/resources/views/admin/content/overview.blade.php @@ -3,11 +3,27 @@ @section('pageHeading', @trans($pageHeading)) @section('headerButtons') - @if($module->exists === true) - - - - @endif + @can('create', \App\Models\Content\Content::class) + @if (!empty($contentModules)) + + @if (count($contentModules) == 1) + + @else + + @endif + + @endif + @endcan @endsection @section('content') @@ -22,132 +38,32 @@ @endif @if (count($pages) > 0) -
    -
    -
    -
    @lang('admin/contents.title')
    -
    @lang('admin/contents.status')
    -
    @lang('admin/contents.moduleName')
    -
    @lang('admin/contents.createdAt')
    -
    @lang('admin/contents.actions')
    -
    - @foreach($pages as $page) -
    -
    - - @if(!view()->exists(template_name($page->template, false))) - - @else - @if(!empty($page->titlePhoto)) - {{$page->title}} - @else - {{$page->title}} - @endif - @endif - +
    +
    +
    +
    +
    +
    @lang('admin/contents.title')
    +
    @lang('admin/contents.status')
    +
    @lang('admin/contents.moduleName')
    +
    @lang('admin/contents.createdAt')
    +
    @lang('admin/contents.actions')
    -
    - - {{$page->title}} - + @foreach($pages as $page) + @include('admin.content._partials.overviewRow', ['extraClass' => $page->subpages->isEmpty() ?: 'has-subpages']) - @if($page->isHomepage) @lang('admin/contents.homepage') @endif -
    -
    - {{$statuses[$page->status]}} -
    - -
    @date($page->created_at)
    -
    -
    - - - - - - - - -
    -
      - - @if(!$page->isHomepage) -
    • - - - - -
    • - @endif - -
    • - - - -
    • - - @if($page->isDraft()) -
    • - - - -
    • -
    • - - - -
    • - @else -
    • - - -
    • -
    • - - - -
    • - @endif - -
    • - - -
    • -
    -
    -
    - -
    + @foreach($page->subpages as $subpage) + @include('admin.content._partials.overviewRow', ['page' => $subpage, 'extraClass' => 'subpage hidden-xs-up']) + @endforeach + @endforeach
    - @endforeach +
    + +
    -
    - {!! $pages->render() !!} -
    @else
    diff --git a/resources/views/admin/fileManager/edit.blade.php b/resources/views/admin/fileManager/edit.blade.php index a7336f4f..cd924318 100644 --- a/resources/views/admin/fileManager/edit.blade.php +++ b/resources/views/admin/fileManager/edit.blade.php @@ -2,41 +2,60 @@ @section('pageHeading', @trans('admin/fileManager.edit', ['name' => $file->original_filename])) @section('headerButtons') - - - - @endsection + + + + @can('delete', $file) + + + + @endcan +@endsection @section('content')
    - {!! \App\CMS\Helpers\FileManager::getLargePreview($file) !!} +
    +
    + {!! \App\CMS\Helpers\FileManager::getLargePreview($file) !!} +
    +
    -
    -

    {{$file->original_filename}}

    +
    +
    -
      -
    • @lang('admin/fileManager.createdAt'): {{$file->created_at}}
    • -
    • @lang('admin/fileManager.updatedAt'): {{$file->updated_at}}
    • -
    • @lang('admin/fileManager.mime'): {{$file->mime_type}}
    • -
    • @lang('admin/fileManager.hash'): {{str_limit($file->file_hash, 10)}}
    • -
    • @lang('admin/fileManager.url'): {{$file->filename}}
    • -
    • @lang('admin/fileManager.fileSize'): {{\App\CMS\Helpers\FileManager::getFormattedSize($file)}}
    • +
      +

      {{$file->original_filename}}

      - @foreach($extraInfo as $column => $info) -
    • {{$column}}: {{$info}}
    • - @endforeach +
        +
      • @lang('admin/fileManager.createdAt'): {{$file->created_at}}
      • +
      • @lang('admin/fileManager.updatedAt'): {{$file->updated_at}}
      • +
      • @lang('admin/fileManager.mime'): {{$file->mime_type}}
      • +
      • @lang('admin/fileManager.hash'): {{str_limit($file->file_hash, 10)}}
      • +
      • @lang('admin/fileManager.url'): {{$file->filename}} +
      • +
      • @lang('admin/fileManager.fileSize') + : {{\App\CMS\Helpers\FileManager::getFormattedSize($file)}}
      • -
      -
      + @foreach($extraInfo as $column => $info) +
    • {{$column}}: {{$info}}
    • + @endforeach -
      - @include('admin.fileManager.editForm') +
    +
    + +
    + @include('admin.fileManager.editForm') +
    +
    @@ -49,6 +68,6 @@ @section('javascripts') @stop diff --git a/resources/views/admin/fileManager/editForm.blade.php b/resources/views/admin/fileManager/editForm.blade.php index d7d0e21d..ef8e93db 100644 --- a/resources/views/admin/fileManager/editForm.blade.php +++ b/resources/views/admin/fileManager/editForm.blade.php @@ -1,33 +1,34 @@ -
    - {!! csrf_field() !!} +@can('update', $file) + + {!! csrf_field() !!} - + - + - + - + - - @lang('admin/fileManager.directory') - + + @lang('admin/fileManager.directory') + - + - + - - - -
    + + + +@endcan diff --git a/resources/views/admin/fileManager/filesTiles.blade.php b/resources/views/admin/fileManager/filesTiles.blade.php index cef41a0e..e1f2148e 100644 --- a/resources/views/admin/fileManager/filesTiles.blade.php +++ b/resources/views/admin/fileManager/filesTiles.blade.php @@ -4,7 +4,7 @@ 'body' => ''.\App\CMS\Helpers\FileManager::getPreview($file).'', 'footerClass' => 'text-right', 'cardClass' => 'file-preview', - 'footer' => (!isset($hideDelete) || !$hideDelete) ? ' \Auth::user()->can('delete', $file) && (!isset($hideDelete) || !$hideDelete) ? ' diff --git a/resources/views/admin/fileManager/overview.blade.php b/resources/views/admin/fileManager/overview.blade.php index 54d4c027..3fc4b3b7 100644 --- a/resources/views/admin/fileManager/overview.blade.php +++ b/resources/views/admin/fileManager/overview.blade.php @@ -15,51 +15,64 @@
    -
    -
    - -
    - @include('admin.fileManager.newFileForm') -
    -
    +
    +
    +
    + @can('upload', \App\Models\FileManager\File::class) - @if (!$directory->is_root) -
    - -
    - @include('admin.fileManager.directories.form', ['action' => route('upload.postEditDirectory', ['id' => $directory->id])]) -
    -
    - @endif +
    + +
    + @include('admin.fileManager.newFileForm') +
    +
    + @endcan -
    - -
    - @include('admin.fileManager.directories.form', ['directory' => $newDirectory, 'action' => route('upload.postNewDirectory')]) + + @if (!$directory->is_root) + @can('update', $directory) +
    + +
    + @include('admin.fileManager.directories.form', ['action' => route('upload.postEditDirectory', ['id' => $directory->id])]) +
    +
    + @endcan + @endif + + @can('create', \App\Models\FileManager\Directory::class) +
    + +
    + @include('admin.fileManager.directories.form', ['directory' => $newDirectory, 'action' => route('upload.postNewDirectory')]) +
    +
    + @endcan
    diff --git a/resources/views/admin/history/overview.blade.php b/resources/views/admin/history/overview.blade.php index 78f15280..4cf92a77 100644 --- a/resources/views/admin/history/overview.blade.php +++ b/resources/views/admin/history/overview.blade.php @@ -33,7 +33,9 @@ @endforeach - - @lang('admin/history.backToEdit') - + @can('update', $page) + + @lang('admin/history.backToEdit') + + @endcan @stop \ No newline at end of file diff --git a/resources/views/admin/layout.blade.php b/resources/views/admin/layout.blade.php index 2dae3db6..0a183172 100644 --- a/resources/views/admin/layout.blade.php +++ b/resources/views/admin/layout.blade.php @@ -26,6 +26,13 @@ +@if (session('status')) +
    + + {{ session('status') }} +
    +@endif + @if (session('success'))
    diff --git a/resources/views/admin/permissions/index.blade.php b/resources/views/admin/permissions/index.blade.php new file mode 100644 index 00000000..a4733dc0 --- /dev/null +++ b/resources/views/admin/permissions/index.blade.php @@ -0,0 +1,41 @@ +@extends('admin.layoutWithNavigation') + +@section('pageHeading', trans('admin/permissions.pageTitle')) +@section('pageDescription', trans('admin/permissions.description')) + +@section('content') + +
    + {!! csrf_field() !!} + + @foreach($permissions as $permission) + +
    + +
    + + @if($permission->subpermissions->count() > 0) + @foreach($permission->subpermissions as $subpermission) +
    + +
    + @endforeach + @endif + @endforeach + +
    + +@endsection \ No newline at end of file diff --git a/resources/views/admin/search/page.blade.php b/resources/views/admin/search/page.blade.php index 0c3597bd..d2a0bf30 100644 --- a/resources/views/admin/search/page.blade.php +++ b/resources/views/admin/search/page.blade.php @@ -6,8 +6,16 @@ @if ($search)
    -

    @lang('search.results')

    - @include('admin.search.results') + @if(!empty($results)) +

    @lang('search.results')

    + @include('admin.search.results') + @else + +
    + @lang('admin/common.noSearchEngine') +
    + + @endif

    @lang('search.term')

    diff --git a/resources/views/admin/settings/parts/advanced.blade.php b/resources/views/admin/settings/parts/advanced.blade.php new file mode 100644 index 00000000..00a3b319 --- /dev/null +++ b/resources/views/admin/settings/parts/advanced.blade.php @@ -0,0 +1,81 @@ + +

    @lang('admin/settings.previews.title')

    + +
    +
    + + + +
    + + px +
    +
    +
    + @include('admin.settings.snippets.commonSettings', ['field' => 'previewSize']) +
    + +
    + + + +
    + + % +
    +
    +
    + @include('admin.settings.snippets.commonSettings', ['field' => 'previewQuality']) +
    +
    + +

    @lang('admin/settings.widgets.title')

    + +
    +
    + +
    +
    + @include('admin.settings.snippets.commonSettings', ['field' => 'useWidgetPreloading']) +
    +
    + + +
    +
    + + +
    + + @lang('common.views') +
    +
    +
    + @include('admin.settings.snippets.commonSettings', ['field' => 'author']) +
    +
    + + +
    +
    + + +
    + + @lang('common.minutes') +
    +
    +
    + @include('admin.settings.snippets.commonSettings', ['field' => 'author']) +
    +
    diff --git a/resources/views/admin/snippets/buttons/delete.blade.php b/resources/views/admin/snippets/buttons/delete.blade.php new file mode 100644 index 00000000..8fee6356 --- /dev/null +++ b/resources/views/admin/snippets/buttons/delete.blade.php @@ -0,0 +1,6 @@ +
    + {!! csrf_field() !!} + {!! method_field('DELETE') !!} + + +
    \ No newline at end of file diff --git a/resources/views/admin/snippets/ckEditor.blade.php b/resources/views/admin/snippets/ckEditor.blade.php index 450aaeca..785794d6 100644 --- a/resources/views/admin/snippets/ckEditor.blade.php +++ b/resources/views/admin/snippets/ckEditor.blade.php @@ -1,29 +1,39 @@ \ No newline at end of file diff --git a/resources/views/admin/templates/directoriesList.blade.php b/resources/views/admin/templates/_partials/directoriesList.blade.php similarity index 68% rename from resources/views/admin/templates/directoriesList.blade.php rename to resources/views/admin/templates/_partials/directoriesList.blade.php index 9835f77b..34a0af7b 100644 --- a/resources/views/admin/templates/directoriesList.blade.php +++ b/resources/views/admin/templates/_partials/directoriesList.blade.php @@ -14,12 +14,11 @@ {{--@endif--}}
    - -
    @lang('admin/templates.subdirectories')
    - - @forelse($subdirectories as $subdirectory) - {{trans($subdirectory->name)}} +
      + @forelse($directory->subdirectories as $subdirectory) +
    • {{trans($subdirectory->name)}}
    • @empty - @lang('admin/templates.noSubdirectories') +
    • @lang('admin/templates.noSubdirectories')
    • @endforelse +
    \ No newline at end of file diff --git a/resources/views/admin/templates/editForm.blade.php b/resources/views/admin/templates/_partials/editForm.blade.php similarity index 100% rename from resources/views/admin/templates/editForm.blade.php rename to resources/views/admin/templates/_partials/editForm.blade.php diff --git a/resources/views/admin/templates/_partials/templatesTiles.blade.php b/resources/views/admin/templates/_partials/templatesTiles.blade.php new file mode 100644 index 00000000..157a9ecd --- /dev/null +++ b/resources/views/admin/templates/_partials/templatesTiles.blade.php @@ -0,0 +1,70 @@ +
    + @forelse($directory->templates as $template) +
    +
    + {{str_limit($template->name, 15)}} +
    +
    + {{str_limit($template->description, 150)}} +
    + + @can('copy', \App\Models\Templates\Template::class) + @if($isWritable) + + + + @else + + + + @endif + @endcan + @can('update', $template) + + @if ($template->editable) + + @else + + @endif + + + @endcan +
    + @empty +
    + @lang('admin/templates.noTemplates') +
    + @endforelse +
    + +@section('javascripts') + +@endsection \ No newline at end of file diff --git a/resources/views/admin/templates/edit.blade.php b/resources/views/admin/templates/edit.blade.php index df60b694..5e342914 100644 --- a/resources/views/admin/templates/edit.blade.php +++ b/resources/views/admin/templates/edit.blade.php @@ -3,5 +3,5 @@ @section('pageHeading', @trans('admin/templates.edit', ['name' => $template->template_name])) @section('content') - @include('admin.templates.editForm') + @include('admin.templates._partials.editForm') @stop \ No newline at end of file diff --git a/resources/views/admin/templates/index.blade.php b/resources/views/admin/templates/index.blade.php new file mode 100644 index 00000000..e84ebb6d --- /dev/null +++ b/resources/views/admin/templates/index.blade.php @@ -0,0 +1,13 @@ +@extends('admin.layoutWithNavigation') + +@section('pageHeading', @trans('admin/templates.overview')) + +@section('content') +
    +
    + @foreach($templatePaths as $directory) + @include('admin.templates._partials.directoriesList') + @endforeach +
    +
    +@endsection \ No newline at end of file diff --git a/resources/views/admin/templates/list.blade.php b/resources/views/admin/templates/list.blade.php index 95e6e0bc..003295c9 100644 --- a/resources/views/admin/templates/list.blade.php +++ b/resources/views/admin/templates/list.blade.php @@ -3,16 +3,24 @@ @section('pageHeading', @trans('admin/templates.overview')) @section('content') -
    + + + +
    - @include('admin.templates.templatesTiles') +
    +
    + @include('admin.templates._partials.templatesTiles') +
    +
    -
    - @include('admin.templates.directoriesList') +
    +
    + @include('admin.templates._partials.directoriesList') +
    - -@stop \ No newline at end of file +@endsection \ No newline at end of file diff --git a/resources/views/admin/templates/templatesTiles.blade.php b/resources/views/admin/templates/templatesTiles.blade.php deleted file mode 100644 index 4a5d5041..00000000 --- a/resources/views/admin/templates/templatesTiles.blade.php +++ /dev/null @@ -1,66 +0,0 @@ -
    - @forelse($templates as $template) -
    -
    - {{str_limit($template->name, 15)}} -
    -
    - {{str_limit($template->description, 150)}} -
    - - @if($isWritable) - - - - @else - - - - @endif - - @if ($template->editable) - - @else - - @endif - - -
    - @empty -
    - @lang('admin/templates.noTemplates') -
    - @endforelse -
    - -@section('javascripts') - -@endsection \ No newline at end of file diff --git a/resources/views/admin/userManagement/detail.blade.php b/resources/views/admin/userManagement/detail.blade.php index 4d566885..0f719143 100644 --- a/resources/views/admin/userManagement/detail.blade.php +++ b/resources/views/admin/userManagement/detail.blade.php @@ -3,10 +3,13 @@ @section('pageHeading', trans('admin/userManagement.profile')) @section('pageDescription', @trans('admin/userManagement.detail', ['name' => $user->name, 'email' => $user->email])) @section('headerButtons') - - - + + @can('manage', \App\Models\User::class) + + + + @endcan @endsection @section('content') @@ -32,12 +35,24 @@ - + @can('update', $user) + + @endcan + + @can('set-permissions', $user) + + @endcan
  • @lang('admin/widgets.updatedAt'): @date($widgetArea->updated_at)
  • - @lang('admin/widgetAreas.editButton') - - @if (!empty($associatedWidgetIds)) -

    @lang('admin/widgets.preview')

    - - @widgetArea($widgetArea->code) - @endif + @can('update', $widgetArea) + @lang('admin/widgetAreas.editButton') + @endcan
    @stop \ No newline at end of file diff --git a/resources/views/admin/widgets/htmlCode/edit.blade.php b/resources/views/admin/widgets/htmlCode/edit.blade.php index e91e4a74..71ac1a11 100644 --- a/resources/views/admin/widgets/htmlCode/edit.blade.php +++ b/resources/views/admin/widgets/htmlCode/edit.blade.php @@ -2,6 +2,12 @@ @section('pageHeading', @trans('widgets/htmlCode.edit', ['name' => $widget->name])) +@section('headerButtons') + + + +@endsection + @section('content')
    @include('admin.widgets.htmlCode.form', ['action' => route('widgets.postEdit', ['id' => $widget->id])]) diff --git a/resources/views/admin/widgets/menu/edit.blade.php b/resources/views/admin/widgets/menu/edit.blade.php index 5b21f9e9..e5c396ed 100644 --- a/resources/views/admin/widgets/menu/edit.blade.php +++ b/resources/views/admin/widgets/menu/edit.blade.php @@ -2,11 +2,16 @@ @section('pageHeading', @trans('widgets/menu.edit', ['name' => $widget->name])) +@section('headerButtons') + + + +@endsection + @section('content')
    @include('admin.widgets.menu.form', ['formAction' => route('widgets.postEdit', ['id' => $widget->id])]) -

    @lang('widgets/menu.preview')

    @@ -14,5 +19,5 @@ @widgetPreview($widget)
    -@stop +@endsection diff --git a/resources/views/admin/widgets/menu/form.blade.php b/resources/views/admin/widgets/menu/form.blade.php index ad5ffece..9d9a1215 100644 --- a/resources/views/admin/widgets/menu/form.blade.php +++ b/resources/views/admin/widgets/menu/form.blade.php @@ -1,5 +1,5 @@
    - + @include('admin.widgets.snippets.commonForm') @@ -8,7 +8,7 @@

    @lang('widgets/menu.addedPages')

    diff --git a/resources/views/admin/widgets/widgetsToAssociate.blade.php b/resources/views/admin/widgets/widgetsToAssociate.blade.php index 81671c3f..145209da 100644 --- a/resources/views/admin/widgets/widgetsToAssociate.blade.php +++ b/resources/views/admin/widgets/widgetsToAssociate.blade.php @@ -13,17 +13,23 @@ {{trans(call_user_func([$widget->widget_type_handler, 'getName']))}}
    diff --git a/resources/views/admin/loginForm.blade.php b/resources/views/auth/login.blade.php similarity index 65% rename from resources/views/admin/loginForm.blade.php rename to resources/views/auth/login.blade.php index d44cc144..569fea3d 100644 --- a/resources/views/admin/loginForm.blade.php +++ b/resources/views/auth/login.blade.php @@ -8,7 +8,7 @@

    - {{isset($pageName) ? $pageName : ''}} + @lang('admin/loginForm.login')

    @@ -24,6 +24,12 @@ name="email" id="email" placeholder="@lang('admin/loginForm.yourEmail')" required> + + @if ($errors->has('email')) + + {{ $errors->first('email') }} + + @endif
    @@ -32,13 +38,27 @@ name="password" id="password" placeholder="@lang('admin/loginForm.yourPassword')" required> + + @if ($errors->has('password')) + + {{ $errors->first('password') }} + + @endif
    -
    -@endsection \ No newline at end of file +@endsection diff --git a/resources/views/auth/passwords/email.blade.php b/resources/views/auth/passwords/email.blade.php new file mode 100644 index 00000000..161c650d --- /dev/null +++ b/resources/views/auth/passwords/email.blade.php @@ -0,0 +1,42 @@ +@extends('admin.layout') + +@section('pageHeading', trans('admin/loginForm.forgottenPassword')) + +@section('page') +
    +
    +
    +
    +

    + @lang('admin/loginForm.forgottenPassword') +

    +
    +
    + +
    + {!! csrf_field() !!} + +
    + + + + + @if ($errors->has('email')) + + {{ $errors->first('email') }} + + @endif +
    + +
    + +
    +
    +
    +
    +
    +
    +@endsection diff --git a/resources/views/auth/passwords/reset.blade.php b/resources/views/auth/passwords/reset.blade.php new file mode 100644 index 00000000..34c8d196 --- /dev/null +++ b/resources/views/auth/passwords/reset.blade.php @@ -0,0 +1,68 @@ +@extends('admin.layout') + +@section('pageHeading', trans('admin/loginForm.passwordReset')) + +@section('page') +
    +
    +
    +
    +

    + @lang('admin/loginForm.passwordReset') +

    +
    +
    +
    + {!! csrf_field() !!} + + + +
    + + + + + @if ($errors->has('email')) + + {{ $errors->first('email') }} + + @endif +
    + +
    + + + + + @if ($errors->has('password')) + + {{ $errors->first('password') }} + + @endif +
    + +
    + + + + @if ($errors->has('password_confirmation')) + + {{ $errors->first('password_confirmation') }} + + @endif +
    + +
    + +
    +
    +
    +
    +
    +
    +@endsection diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php new file mode 100644 index 00000000..10f9a9a7 --- /dev/null +++ b/resources/views/auth/register.blade.php @@ -0,0 +1,89 @@ +@extends('admin.layout') + +@section('pageHeading', trans('register.heading')) + +@section('page') +
    +
    +
    +
    +

    + @lang('register.heading') +

    +
    +
    +
    + {!! csrf_field() !!} + +
    + + + + + @if ($errors->has('name')) + + {{ $errors->first('name') }} + + @endif +
    + +
    + + + + + @if ($errors->has('email')) + + {{ $errors->first('email') }} + + @endif +
    + +
    + + + + + @if ($errors->has('password')) + + {{ $errors->first('password') }} + + @endif +
    + +
    + + +
    + +
    + {!! \Greggilbert\Recaptcha\Facades\Recaptcha::render() !!} + + @if ($errors->has('g-recaptcha-response')) + + {{ $errors->first('g-recaptcha-response') }} + + @endif + +
    + + +
    + +
    + +
    +
    +
    +
    +
    +
    +@endsection diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php new file mode 100644 index 00000000..d4745b4e --- /dev/null +++ b/resources/views/layouts/app.blade.php @@ -0,0 +1,80 @@ + + + + + + + + + + + {{ config('app.name', 'Laravel') }} + + + + + +
    + + + @yield('content') +
    + + + + + diff --git a/resources/views/vendor/mail/html/button.blade.php b/resources/views/vendor/mail/html/button.blade.php new file mode 100644 index 00000000..c7aae1b8 --- /dev/null +++ b/resources/views/vendor/mail/html/button.blade.php @@ -0,0 +1,19 @@ + + + + +
    + + + + +
    + + + + +
    + {{ $slot }} +
    +
    +
    diff --git a/resources/views/vendor/mail/html/footer.blade.php b/resources/views/vendor/mail/html/footer.blade.php new file mode 100644 index 00000000..c3f9360a --- /dev/null +++ b/resources/views/vendor/mail/html/footer.blade.php @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/resources/views/vendor/mail/html/header.blade.php b/resources/views/vendor/mail/html/header.blade.php new file mode 100644 index 00000000..eefabab9 --- /dev/null +++ b/resources/views/vendor/mail/html/header.blade.php @@ -0,0 +1,7 @@ + + + + {{ $slot }} + + + diff --git a/resources/views/vendor/mail/html/layout.blade.php b/resources/views/vendor/mail/html/layout.blade.php new file mode 100644 index 00000000..991ae52a --- /dev/null +++ b/resources/views/vendor/mail/html/layout.blade.php @@ -0,0 +1,54 @@ + + + + + + + + + + + + + +
    + + {{ $header or '' }} + + + + + + + {{ $footer or '' }} +
    + + + + + +
    + {{ Illuminate\Mail\Markdown::parse($slot) }} + + {{ $subcopy or '' }} +
    +
    +
    + + diff --git a/resources/views/vendor/mail/html/message.blade.php b/resources/views/vendor/mail/html/message.blade.php new file mode 100644 index 00000000..2ad23a66 --- /dev/null +++ b/resources/views/vendor/mail/html/message.blade.php @@ -0,0 +1,27 @@ +@component('mail::layout') + {{-- Header --}} + @slot('header') + @component('mail::header', ['url' => config('app.url')]) + {{ config('app.name') }} + @endcomponent + @endslot + + {{-- Body --}} + {{ $slot }} + + {{-- Subcopy --}} + @isset($subcopy) + @slot('subcopy') + @component('mail::subcopy') + {{ $subcopy }} + @endcomponent + @endslot + @endisset + + {{-- Footer --}} + @slot('footer') + @component('mail::footer') + © {{ date('Y') }} {{ config('app.name') }}. All rights reserved. + @endcomponent + @endslot +@endcomponent diff --git a/resources/views/vendor/mail/html/panel.blade.php b/resources/views/vendor/mail/html/panel.blade.php new file mode 100644 index 00000000..f3970802 --- /dev/null +++ b/resources/views/vendor/mail/html/panel.blade.php @@ -0,0 +1,13 @@ + + + + +
    + + + + +
    + {{ Illuminate\Mail\Markdown::parse($slot) }} +
    +
    diff --git a/resources/views/vendor/mail/html/promotion.blade.php b/resources/views/vendor/mail/html/promotion.blade.php new file mode 100644 index 00000000..0debcf8a --- /dev/null +++ b/resources/views/vendor/mail/html/promotion.blade.php @@ -0,0 +1,7 @@ + + + + +
    + {{ Illuminate\Mail\Markdown::parse($slot) }} +
    diff --git a/resources/views/vendor/mail/html/promotion/button.blade.php b/resources/views/vendor/mail/html/promotion/button.blade.php new file mode 100644 index 00000000..8e79081c --- /dev/null +++ b/resources/views/vendor/mail/html/promotion/button.blade.php @@ -0,0 +1,13 @@ + + + + +
    + + + + +
    + {{ $slot }} +
    +
    diff --git a/resources/views/vendor/mail/html/subcopy.blade.php b/resources/views/vendor/mail/html/subcopy.blade.php new file mode 100644 index 00000000..c3df7b4c --- /dev/null +++ b/resources/views/vendor/mail/html/subcopy.blade.php @@ -0,0 +1,7 @@ + + + + +
    + {{ Illuminate\Mail\Markdown::parse($slot) }} +
    diff --git a/resources/views/vendor/mail/html/table.blade.php b/resources/views/vendor/mail/html/table.blade.php new file mode 100644 index 00000000..a5f3348b --- /dev/null +++ b/resources/views/vendor/mail/html/table.blade.php @@ -0,0 +1,3 @@ +
    +{{ Illuminate\Mail\Markdown::parse($slot) }} +
    diff --git a/resources/views/vendor/mail/html/themes/default.css b/resources/views/vendor/mail/html/themes/default.css new file mode 100644 index 00000000..20659933 --- /dev/null +++ b/resources/views/vendor/mail/html/themes/default.css @@ -0,0 +1,285 @@ +/* Base */ + +body, body *:not(html):not(style):not(br):not(tr):not(code) { + font-family: Avenir, Helvetica, sans-serif; + box-sizing: border-box; +} + +body { + background-color: #f5f8fa; + color: #74787E; + height: 100%; + hyphens: auto; + line-height: 1.4; + margin: 0; + -moz-hyphens: auto; + -ms-word-break: break-all; + width: 100% !important; + -webkit-hyphens: auto; + -webkit-text-size-adjust: none; + word-break: break-all; + word-break: break-word; +} + +p, +ul, +ol, +blockquote { + line-height: 1.4; + text-align: left; +} + +a { + color: #3869D4; +} + +a img { + border: none; +} + +/* Typography */ + +h1 { + color: #2F3133; + font-size: 19px; + font-weight: bold; + margin-top: 0; + text-align: left; +} + +h2 { + color: #2F3133; + font-size: 16px; + font-weight: bold; + margin-top: 0; + text-align: left; +} + +h3 { + color: #2F3133; + font-size: 14px; + font-weight: bold; + margin-top: 0; + text-align: left; +} + +p { + color: #74787E; + font-size: 16px; + line-height: 1.5em; + margin-top: 0; + text-align: left; +} + +p.sub { + font-size: 12px; +} + +img { + max-width: 100%; +} + +/* Layout */ + +.wrapper { + background-color: #f5f8fa; + margin: 0; + padding: 0; + width: 100%; + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; +} + +.content { + margin: 0; + padding: 0; + width: 100%; + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; +} + +/* Header */ + +.header { + padding: 25px 0; + text-align: center; +} + +.header a { + color: #bbbfc3; + font-size: 19px; + font-weight: bold; + text-decoration: none; + text-shadow: 0 1px 0 white; +} + +/* Body */ + +.body { + background-color: #FFFFFF; + border-bottom: 1px solid #EDEFF2; + border-top: 1px solid #EDEFF2; + margin: 0; + padding: 0; + width: 100%; + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; +} + +.inner-body { + background-color: #FFFFFF; + margin: 0 auto; + padding: 0; + width: 570px; + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 570px; +} + +/* Subcopy */ + +.subcopy { + border-top: 1px solid #EDEFF2; + margin-top: 25px; + padding-top: 25px; +} + +.subcopy p { + font-size: 12px; +} + +/* Footer */ + +.footer { + margin: 0 auto; + padding: 0; + text-align: center; + width: 570px; + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 570px; +} + +.footer p { + color: #AEAEAE; + font-size: 12px; + text-align: center; +} + +/* Tables */ + +.table table { + margin: 30px auto; + width: 100%; + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; +} + +.table th { + border-bottom: 1px solid #EDEFF2; + padding-bottom: 8px; +} + +.table td { + color: #74787E; + font-size: 15px; + line-height: 18px; + padding: 10px 0; +} + +.content-cell { + padding: 35px; +} + +/* Buttons */ + +.action { + margin: 30px auto; + padding: 0; + text-align: center; + width: 100%; + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; +} + +.button { + border-radius: 3px; + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.16); + color: #FFF; + display: inline-block; + text-decoration: none; + -webkit-text-size-adjust: none; +} + +.button-blue { + background-color: #3097D1; + border-top: 10px solid #3097D1; + border-right: 18px solid #3097D1; + border-bottom: 10px solid #3097D1; + border-left: 18px solid #3097D1; +} + +.button-green { + background-color: #2ab27b; + border-top: 10px solid #2ab27b; + border-right: 18px solid #2ab27b; + border-bottom: 10px solid #2ab27b; + border-left: 18px solid #2ab27b; +} + +.button-red { + background-color: #bf5329; + border-top: 10px solid #bf5329; + border-right: 18px solid #bf5329; + border-bottom: 10px solid #bf5329; + border-left: 18px solid #bf5329; +} + +/* Panels */ + +.panel { + margin: 0 0 21px; +} + +.panel-content { + background-color: #EDEFF2; + padding: 16px; +} + +.panel-item { + padding: 0; +} + +.panel-item p:last-of-type { + margin-bottom: 0; + padding-bottom: 0; +} + +/* Promotions */ + +.promotion { + background-color: #FFFFFF; + border: 2px dashed #9BA2AB; + margin: 0; + margin-bottom: 25px; + margin-top: 25px; + padding: 24px; + width: 100%; + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; +} + +.promotion h1 { + text-align: center; +} + +.promotion p { + font-size: 15px; + text-align: center; +} diff --git a/resources/views/vendor/mail/markdown/button.blade.php b/resources/views/vendor/mail/markdown/button.blade.php new file mode 100644 index 00000000..97444ebd --- /dev/null +++ b/resources/views/vendor/mail/markdown/button.blade.php @@ -0,0 +1 @@ +{{ $slot }}: {{ $url }} diff --git a/resources/views/vendor/mail/markdown/footer.blade.php b/resources/views/vendor/mail/markdown/footer.blade.php new file mode 100644 index 00000000..3338f620 --- /dev/null +++ b/resources/views/vendor/mail/markdown/footer.blade.php @@ -0,0 +1 @@ +{{ $slot }} diff --git a/resources/views/vendor/mail/markdown/header.blade.php b/resources/views/vendor/mail/markdown/header.blade.php new file mode 100644 index 00000000..aaa3e575 --- /dev/null +++ b/resources/views/vendor/mail/markdown/header.blade.php @@ -0,0 +1 @@ +[{{ $slot }}]({{ $url }}) diff --git a/resources/views/vendor/mail/markdown/layout.blade.php b/resources/views/vendor/mail/markdown/layout.blade.php new file mode 100644 index 00000000..9378baa0 --- /dev/null +++ b/resources/views/vendor/mail/markdown/layout.blade.php @@ -0,0 +1,9 @@ +{!! strip_tags($header) !!} + +{!! strip_tags($slot) !!} +@isset($subcopy) + +{!! strip_tags($subcopy) !!} +@endisset + +{!! strip_tags($footer) !!} diff --git a/resources/views/vendor/mail/markdown/message.blade.php b/resources/views/vendor/mail/markdown/message.blade.php new file mode 100644 index 00000000..b409c71c --- /dev/null +++ b/resources/views/vendor/mail/markdown/message.blade.php @@ -0,0 +1,27 @@ +@component('mail::layout') + {{-- Header --}} + @slot('header') + @component('mail::header', ['url' => config('app.url')]) + {{ config('app.name') }} + @endcomponent + @endslot + + {{-- Body --}} + {{ $slot }} + + {{-- Subcopy --}} + @isset($subcopy) + @slot('subcopy') + @component('mail::subcopy') + {{ $subcopy }} + @endcomponent + @endslot + @endisset + + {{-- Footer --}} + @slot('footer') + @component('mail::footer') + © {{ date('Y') }} {{ config('app.name') }}. All rights reserved. + @endcomponent + @endslot +@endcomponent diff --git a/resources/views/vendor/mail/markdown/panel.blade.php b/resources/views/vendor/mail/markdown/panel.blade.php new file mode 100644 index 00000000..3338f620 --- /dev/null +++ b/resources/views/vendor/mail/markdown/panel.blade.php @@ -0,0 +1 @@ +{{ $slot }} diff --git a/resources/views/vendor/mail/markdown/promotion.blade.php b/resources/views/vendor/mail/markdown/promotion.blade.php new file mode 100644 index 00000000..3338f620 --- /dev/null +++ b/resources/views/vendor/mail/markdown/promotion.blade.php @@ -0,0 +1 @@ +{{ $slot }} diff --git a/resources/views/vendor/mail/markdown/promotion/button.blade.php b/resources/views/vendor/mail/markdown/promotion/button.blade.php new file mode 100644 index 00000000..aaa3e575 --- /dev/null +++ b/resources/views/vendor/mail/markdown/promotion/button.blade.php @@ -0,0 +1 @@ +[{{ $slot }}]({{ $url }}) diff --git a/resources/views/vendor/mail/markdown/subcopy.blade.php b/resources/views/vendor/mail/markdown/subcopy.blade.php new file mode 100644 index 00000000..3338f620 --- /dev/null +++ b/resources/views/vendor/mail/markdown/subcopy.blade.php @@ -0,0 +1 @@ +{{ $slot }} diff --git a/resources/views/vendor/mail/markdown/table.blade.php b/resources/views/vendor/mail/markdown/table.blade.php new file mode 100644 index 00000000..3338f620 --- /dev/null +++ b/resources/views/vendor/mail/markdown/table.blade.php @@ -0,0 +1 @@ +{{ $slot }} diff --git a/resources/views/vendor/notifications/email.blade.php b/resources/views/vendor/notifications/email.blade.php new file mode 100644 index 00000000..5f008b4c --- /dev/null +++ b/resources/views/vendor/notifications/email.blade.php @@ -0,0 +1,36 @@ +@component('mail::message') + {{-- Intro Lines --}} + @foreach ($introLines as $line) + {!!$line!!} + + @endforeach + + {{-- Action Button --}} + @isset($actionText) + + @component('mail::button', ['url' => $actionUrl, 'color' => $color]) + {!!$actionText!!} + @endcomponent + @endisset + + {{-- Outro Lines --}} + @foreach ($outroLines as $line) + {!!$line!!} + @endforeach + + {{-- Salutation --}} + @if (! empty($salutation)) + {!!$salutation!!} + @endif +@endcomponent diff --git a/resources/views/vendor/nwidart/menus/child/dropdown.blade.php b/resources/views/vendor/nwidart/menus/child/dropdown.blade.php new file mode 100644 index 00000000..e02f1e33 --- /dev/null +++ b/resources/views/vendor/nwidart/menus/child/dropdown.blade.php @@ -0,0 +1,12 @@ + diff --git a/resources/views/vendor/nwidart/menus/child/item.blade.php b/resources/views/vendor/nwidart/menus/child/item.blade.php new file mode 100644 index 00000000..4a1fea66 --- /dev/null +++ b/resources/views/vendor/nwidart/menus/child/item.blade.php @@ -0,0 +1,11 @@ +@if ($item->isDivider()) +
  • +@elseif ($item->isHeader()) + +@else +
  • + + {{ $item->title }} + +
  • +@endif diff --git a/resources/views/vendor/nwidart/menus/default.blade.php b/resources/views/vendor/nwidart/menus/default.blade.php new file mode 100644 index 00000000..a4b286fa --- /dev/null +++ b/resources/views/vendor/nwidart/menus/default.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/vendor/nwidart/menus/item/dropdown.blade.php b/resources/views/vendor/nwidart/menus/item/dropdown.blade.php new file mode 100644 index 00000000..5dc6f342 --- /dev/null +++ b/resources/views/vendor/nwidart/menus/item/dropdown.blade.php @@ -0,0 +1,15 @@ + diff --git a/resources/views/vendor/nwidart/menus/item/item.blade.php b/resources/views/vendor/nwidart/menus/item/item.blade.php new file mode 100644 index 00000000..d2278747 --- /dev/null +++ b/resources/views/vendor/nwidart/menus/item/item.blade.php @@ -0,0 +1,12 @@ +@if ($item->isDivider()) +
  • +@elseif ($item->isHeader()) + +@else +
  • + getAttributes() !!}> + {!! $item->getIcon() !!} + {{ $item->title }} + +
  • +@endif diff --git a/resources/views/vendor/nwidart/menus/menu.blade.php b/resources/views/vendor/nwidart/menus/menu.blade.php new file mode 100644 index 00000000..aef51281 --- /dev/null +++ b/resources/views/vendor/nwidart/menus/menu.blade.php @@ -0,0 +1,7 @@ +@foreach ($items as $item) + @if ($item->hasChilds()) + @include('menus::item.dropdown', compact('item')) + @else + @include('menus::item.item', compact('item')) + @endif +@endforeach diff --git a/resources/views/vendor/nwidart/menus/nav-pills-justified.blade.php b/resources/views/vendor/nwidart/menus/nav-pills-justified.blade.php new file mode 100644 index 00000000..325bd9ee --- /dev/null +++ b/resources/views/vendor/nwidart/menus/nav-pills-justified.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/vendor/nwidart/menus/nav-pills-stacked.blade.php b/resources/views/vendor/nwidart/menus/nav-pills-stacked.blade.php new file mode 100644 index 00000000..dbe0131f --- /dev/null +++ b/resources/views/vendor/nwidart/menus/nav-pills-stacked.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/vendor/nwidart/menus/nav-pills.blade.php b/resources/views/vendor/nwidart/menus/nav-pills.blade.php new file mode 100644 index 00000000..46d91da2 --- /dev/null +++ b/resources/views/vendor/nwidart/menus/nav-pills.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/vendor/nwidart/menus/nav-tabs-justified.blade.php b/resources/views/vendor/nwidart/menus/nav-tabs-justified.blade.php new file mode 100644 index 00000000..03ce5de2 --- /dev/null +++ b/resources/views/vendor/nwidart/menus/nav-tabs-justified.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/vendor/nwidart/menus/nav-tabs.blade.php b/resources/views/vendor/nwidart/menus/nav-tabs.blade.php new file mode 100644 index 00000000..445455b4 --- /dev/null +++ b/resources/views/vendor/nwidart/menus/nav-tabs.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/vendor/nwidart/menus/navbar-left.blade.php b/resources/views/vendor/nwidart/menus/navbar-left.blade.php new file mode 100644 index 00000000..bc2cf1c8 --- /dev/null +++ b/resources/views/vendor/nwidart/menus/navbar-left.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/vendor/nwidart/menus/navbar-right.blade.php b/resources/views/vendor/nwidart/menus/navbar-right.blade.php new file mode 100644 index 00000000..67aa7532 --- /dev/null +++ b/resources/views/vendor/nwidart/menus/navbar-right.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/vendor/nwidart/menus/style.blade.php b/resources/views/vendor/nwidart/menus/style.blade.php new file mode 100644 index 00000000..76f31ec4 --- /dev/null +++ b/resources/views/vendor/nwidart/menus/style.blade.php @@ -0,0 +1,49 @@ + diff --git a/resources/views/vendor/pagination/bootstrap-4.blade.php b/resources/views/vendor/pagination/bootstrap-4.blade.php new file mode 100644 index 00000000..3f984557 --- /dev/null +++ b/resources/views/vendor/pagination/bootstrap-4.blade.php @@ -0,0 +1,36 @@ +@if ($paginator->hasPages()) +
      + {{-- Previous Page Link --}} + @if ($paginator->onFirstPage()) +
    • «
    • + @else +
    • + @endif + + {{-- Pagination Elements --}} + @foreach ($elements as $element) + {{-- "Three Dots" Separator --}} + @if (is_string($element)) +
    • {{ $element }}
    • + @endif + + {{-- Array Of Links --}} + @if (is_array($element)) + @foreach ($element as $page => $url) + @if ($page == $paginator->currentPage()) +
    • {{ $page }}
    • + @else +
    • {{ $page }}
    • + @endif + @endforeach + @endif + @endforeach + + {{-- Next Page Link --}} + @if ($paginator->hasMorePages()) +
    • + @else +
    • »
    • + @endif +
    +@endif diff --git a/resources/views/vendor/pagination/default.blade.php b/resources/views/vendor/pagination/default.blade.php new file mode 100644 index 00000000..4e795ff4 --- /dev/null +++ b/resources/views/vendor/pagination/default.blade.php @@ -0,0 +1,36 @@ +@if ($paginator->hasPages()) +
      + {{-- Previous Page Link --}} + @if ($paginator->onFirstPage()) +
    • «
    • + @else +
    • + @endif + + {{-- Pagination Elements --}} + @foreach ($elements as $element) + {{-- "Three Dots" Separator --}} + @if (is_string($element)) +
    • {{ $element }}
    • + @endif + + {{-- Array Of Links --}} + @if (is_array($element)) + @foreach ($element as $page => $url) + @if ($page == $paginator->currentPage()) +
    • {{ $page }}
    • + @else +
    • {{ $page }}
    • + @endif + @endforeach + @endif + @endforeach + + {{-- Next Page Link --}} + @if ($paginator->hasMorePages()) +
    • + @else +
    • »
    • + @endif +
    +@endif diff --git a/resources/views/vendor/pagination/simple-bootstrap-4.blade.php b/resources/views/vendor/pagination/simple-bootstrap-4.blade.php new file mode 100644 index 00000000..a9a18d32 --- /dev/null +++ b/resources/views/vendor/pagination/simple-bootstrap-4.blade.php @@ -0,0 +1,17 @@ +@if ($paginator->hasPages()) +
      + {{-- Previous Page Link --}} + @if ($paginator->onFirstPage()) +
    • @lang('pagination.previous')
    • + @else +
    • + @endif + + {{-- Next Page Link --}} + @if ($paginator->hasMorePages()) +
    • + @else +
    • @lang('pagination.next')
    • + @endif +
    +@endif diff --git a/resources/views/vendor/pagination/simple-default.blade.php b/resources/views/vendor/pagination/simple-default.blade.php new file mode 100644 index 00000000..18016092 --- /dev/null +++ b/resources/views/vendor/pagination/simple-default.blade.php @@ -0,0 +1,17 @@ +@if ($paginator->hasPages()) +
      + {{-- Previous Page Link --}} + @if ($paginator->onFirstPage()) +
    • @lang('pagination.previous')
    • + @else +
    • + @endif + + {{-- Next Page Link --}} + @if ($paginator->hasMorePages()) +
    • + @else +
    • @lang('pagination.next')
    • + @endif +
    +@endif diff --git a/routes/admin.php b/routes/admin.php new file mode 100644 index 00000000..7218ff0a --- /dev/null +++ b/routes/admin.php @@ -0,0 +1,37 @@ + LaravelLocalization::setLocale() . '/admin', + 'middleware' => ['bindings', 'admin'] + ], function () { + + // include all routes in routes/admin subfolder + $files = File::allFiles('routes/admin'); + foreach ($files as $file) { + require_once base_path($file); + } + + // display dashboard with some usefull information + Route::get('/', 'Dashboard\Dashboard@index') + ->name('admin.dashboard'); + + // list of all actions + Route::get('actions', 'ActionLog\Overview@index') + ->name('log.overview') + ->middleware('can:manage,' . \App\Models\ActionLog\ActionLog::class); + + // search form with results + Route::get('search', 'Search@getSearch') + ->name('search'); +}); \ No newline at end of file diff --git a/routes/admin/contents.php b/routes/admin/contents.php new file mode 100644 index 00000000..53fc4094 --- /dev/null +++ b/routes/admin/contents.php @@ -0,0 +1,56 @@ + 'Contents'], function () { + // list of all static pages + Route::get('content/overview/{module?}', 'ContentOverview@index') + ->name('content.overview') + ->middleware('can:manage,' . \App\Models\Content\Content::class); + + // form for creating new static page + Route::get('content/new/{module}', 'CreateNewContent@create') + ->name('content.new')// ->middleware(['can:create,module', 'can:create,' . \App\Models\Content\Content::class]); + ->middleware('can:create,' . \App\Models\Content\Content::class); + + // form for editing existing static page + Route::get('content/edit/{page}', 'EditContent@edit') + ->name('content.edit') + ->middleware('can:update,page'); + + // post method for creating new static page + Route::post('content/new/{module}', 'CreateNewContent@store') + ->name('content.newPost') + ->middleware('can:create,' . \App\Models\Content\Content::class); + // ->middleware('can:create,module'); + + // post method for creating new static page + Route::post('content/edit/{page}', 'EditContent@update') + ->name('content.editPost') + ->middleware('can:update,page'); + + // change status of page (protected, public or draft) + Route::get('content/status/{page}/{status}', 'ContentActions@changeStatus') + ->name('content.changeStatus') + ->middleware('can:changeStatus,page,status'); + + // set homepage + Route::get('content/homepage/{page}', 'ContentActions@setHomepage') + ->name('content.setHomepage') + ->middleware('can:setHomepage,page'); + + // delete page + Route::get('content/delete/{page}', 'ContentActions@delete') + ->name('content.delete') + ->middleware('can:delete,page'); + + // history of changes for specified page + Route::get('history/{page}', 'History@getOverview') + ->name('content.history') + ->middleware('can:viewHistory,page'); + + // history of changes for specified page + Route::get('history/diff/{revision}', 'History@getDiff') + ->name('history.diff') + ->middleware('can:viewHistory,'.\App\Models\Content\Content::class); + + Route::get('content/order', 'EditContent@order')->name('content.order'); + Route::post('content/order', 'EditContent@setOrder')->name('content.setOrder'); +}); \ No newline at end of file diff --git a/routes/admin/fileManager.php b/routes/admin/fileManager.php new file mode 100644 index 00000000..8cbb3f3c --- /dev/null +++ b/routes/admin/fileManager.php @@ -0,0 +1,37 @@ + 'FileManager'], function () { + + Route::get('files/overview/{directory?}', 'UploadedFilesOverview@index') + ->name('upload.overview') + ->middleware('can:manage,' . \App\Models\FileManager\File::class); + + // uploader methods + Route::get('directories/edit/{directory}', 'EditDirectory@edit') + ->name('upload.editDirectory') + ->middleware('can:update,directory'); + + Route::post('directories/edit/{directory}', 'EditDirectory@update') + ->name('upload.postEditDirectory') + ->middleware('can:update,directory'); + + route::post('directories/new', 'CreateNewDirectory@store') + ->name('upload.postNewDirectory') + ->middleware('can:create,'.\App\Models\FileManager\Directory::class); + + Route::get('upload/detail/{file}', 'EditUploadedFile@show') + ->name('upload.detail') + ->middleware('can:manage,' . \App\Models\FileManager\File::class); + + Route::post('upload/detail/{file}', 'EditUploadedFile@update') + ->name('upload.postEdit') + ->middleware('can:update,file'); + + Route::get('upload/delete/{file}', 'EditUploadedFile@delete') + ->name('upload.delete') + ->middleware('can:delete,file'); + + // uploader methods + Route::post('upload', 'UploadFile@store') + ->name('upload.postFile') + ->middleware('can:upload,' . \App\Models\FileManager\File::class); +}); diff --git a/routes/admin/settings.php b/routes/admin/settings.php new file mode 100644 index 00000000..4f51cc37 --- /dev/null +++ b/routes/admin/settings.php @@ -0,0 +1,17 @@ +name('settings.overview') + ->middleware('can:manage,' . \App\Models\Settings::class); + +Route::post('settings', 'Settings@saveSettings') + ->name('settings.save') + ->middleware('can:manage,' . \App\Models\Settings::class); + +Route::get('permissions', 'Permissions@index') + ->name('permissions.index') + ->middleware('can:manage,' . \App\Models\Settings::class); + +Route::post('permissions', 'Permissions@setDefault') + ->name('permissions.setDefault') + ->middleware('can:manage,' . \App\Models\Settings::class); \ No newline at end of file diff --git a/routes/admin/templates.php b/routes/admin/templates.php new file mode 100644 index 00000000..d9ad1343 --- /dev/null +++ b/routes/admin/templates.php @@ -0,0 +1,24 @@ + 'Templates'], function () { + + Route::get('templates', 'TemplateOverview@index') + ->name('templates.index') + ->middleware('can:manage,' . \App\Models\Templates\Template::class); + + Route::get('templates/{templatePath}', 'TemplateOverview@getPath') + ->name('templates.overview') + ->middleware('can:manage,' . \App\Models\Templates\Template::class); + + Route::post('templates/copy', 'CopyTemplate@createCopy') + ->name('templates.postCopy') + ->middleware('can:copy,' . \App\Models\Templates\Template::class); + + Route::get('templates/edit/{template}', 'EditTemplate@getEdit') + ->name('templates.edit') + ->middleware('can:update,template'); + + Route::post('templates/edit/{template}', 'EditTemplate@postEdit') + ->name('templates.postEdit') + ->middleware('can:update,template'); +}); \ No newline at end of file diff --git a/routes/admin/users.php b/routes/admin/users.php new file mode 100644 index 00000000..70fc5c44 --- /dev/null +++ b/routes/admin/users.php @@ -0,0 +1,37 @@ + 'Users'], function () { + // display form for creating new user + Route::get('users/new', 'CreateNewUser@getNewUser') + ->name('users.new') + ->middleware('can:create,' . \App\Models\User::class); + + // POST methods + // display form for creating new user + Route::post('users/new', 'CreateNewUser@postRegistration') + ->name('users.newPost') + ->middleware('can:create,' . \App\Models\User::class); + + // display form for edit of existing user + Route::get('users/edit/{user}', 'EditUser@getEditUser') + ->name('users.edit') + ->middleware('can:update,user'); + + // display user detail in admin + Route::get('users/detail/{user}', 'UserDetail@getDetail') + ->name('users.detail') + ->middleware('can:view,user'); + + // method for saving edited data of user + Route::post('users/edit/{user}', 'EditUser@postEdit') + ->name('users.editPost') + ->middleware('can:update,user'); + + // display list of all users registered into our system + Route::get('users/overview/{state?}/{perPage?}', 'UsersOverview@getOverview') + ->name('users.overview') + ->middleware('can:manage,' . \App\Models\User::class); + + Route::post('users/{user}/permissions', 'EditUser@setPermissions') + ->middleware('can:set-permissions,user') + ->name('users.setPermissions'); +}); diff --git a/routes/admin/widgets.php b/routes/admin/widgets.php new file mode 100644 index 00000000..8f9db1c4 --- /dev/null +++ b/routes/admin/widgets.php @@ -0,0 +1,75 @@ + 'Widgets'], function () { + + // list of all installed widget types + Route::get('widgets', 'WidgetsOverview@index') + ->name('widgets.overview') + ->middleware('can:manage,' . \App\Models\Widgets\Widget::class); + + // create new instance of widget of given type + Route::get('widgets/new/{widgetType}', 'CreateNewWidget@getNew') + ->name('widgets.new') + ->middleware('can:create,' . \App\Models\Widgets\Widget::class); + + Route::post('widgets/new/{widgetType}', 'CreateNewWidget@postNew') + ->name('widgets.postNew') + ->middleware('can:create,' . \App\Models\Widgets\Widget::class); + + // edit widget settings + Route::get('widgets/edit/{widget}', 'EditWidget@getEdit') + ->name('widgets.edit') + ->middleware('can:update,widget'); + + // delete widget settings + Route::get('widgets/delete/{widget}', 'EditWidget@deleteWidget') + ->name('widgets.delete') + ->middleware('can:delete,widget'); + + Route::post('widgets/edit/{widget}', 'EditWidget@postEdit') + ->name('widgets.postEdit') + ->middleware('can:update,widget'); + + // display form for association of widget and widget area + Route::get('widgets/associate/{widgetArea}', 'AssociateWidget@getList') + ->name('widgets.associate') + ->middleware('can:assign,' . \App\Models\Widgets\Widget::class); + + Route::get('widgets/deassociate/{widget}/{widgetArea}', 'AssociateWidget@deleteAssociation') + ->name('widgets.deleteAssociation') + ->middleware('can:unassign,' . \App\Models\Widgets\Widget::class); + + Route::get('widgets/associate/{widget}/{widgetArea}', 'AssociateWidget@makeAssociation') + ->name('widgets.makeAssociation') + ->middleware('can:assign,' . \App\Models\Widgets\Widget::class); + + Route::group(['namespace' => 'Areas'], function () { + Route::get('widgets/areas/overview', 'WidgetAreaOverview@getOverview') + ->name('widgetareas.overview') + ->middleware('can:manage,' . \App\Models\Widgets\WidgetArea::class); + + // form for new widget area + Route::get('widgets/areas/new', 'CreateNewWidgetArea@create') + ->name('widgetareas.new') + ->middleware('can:create,' . \App\Models\Widgets\WidgetArea::class); + + // form for new widget area + Route::post('widgets/areas/new', 'CreateNewWidgetArea@store') + ->name('widgetareas.postNew') + ->middleware('can:create,' . \App\Models\Widgets\WidgetArea::class); + + // edit form for widget area + Route::get('widgets/areas/edit/{widgetArea}', 'EditWidgetArea@edit') + ->name('widgetareas.edit') + ->middleware('can:update,widgetArea'); + + Route::post('widgets/areas/edit/{widgetArea}', 'EditWidgetArea@update') + ->name('widgetareas.postEdit') + ->middleware('can:update,widgetArea'); + + // edit form for widget area + Route::get('widgets/areas/delete/{widgetArea}', 'EditWidgetArea@delete') + ->name('widgetareas.delete') + ->middleware('can:delete,widgetArea'); + }); +}); diff --git a/routes/auth.php b/routes/auth.php new file mode 100644 index 00000000..b99618dc --- /dev/null +++ b/routes/auth.php @@ -0,0 +1,6 @@ +get('logout', 'Auth\LoginController@logout') + ->name('logout'); \ No newline at end of file diff --git a/routes/web.php b/routes/web.php new file mode 100644 index 00000000..e88d429c --- /dev/null +++ b/routes/web.php @@ -0,0 +1,26 @@ + LaravelLocalization::setLocale(), 'middleware' => ['bindings', 'web']], function () { + // Homepage + Route::get('/', 'Visitor\Homepage@getIndex') + ->name('page.index'); + + // route for sitemap + Route::get('sitemap.xml', 'Visitor\Sitemap@getMap') + ->name('sitemap'); + + // route for all content pages. This rule must be specified last (because it matches every route) + Route::get('{url}', 'Visitor\ContentPage@getPage') + ->name('page.content'); +}); diff --git a/scripts/install.sh b/scripts/install.sh index 6f534e4f..ca57063c 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -255,8 +255,6 @@ if [ ! -e $THEME_SET_FILE ]; then chmod 0777 resources/views/visitor -R chmod 0777 resources/views/modules -R - chmod 0777 modules/*/module.json - echo $THEME_NAME > $THEME_SET_FILE fi diff --git a/templates/Base/OnePage/Events/AddPageIntoHomepage.php b/templates/Base/OnePage/Events/AddPageIntoHomepage.php deleted file mode 100644 index 2415e477..00000000 --- a/templates/Base/OnePage/Events/AddPageIntoHomepage.php +++ /dev/null @@ -1,18 +0,0 @@ -page = $page; - } -} \ No newline at end of file diff --git a/templates/Base/OnePage/Events/RemovePageFromHomepage.php b/templates/Base/OnePage/Events/RemovePageFromHomepage.php deleted file mode 100644 index 6b7e2e81..00000000 --- a/templates/Base/OnePage/Events/RemovePageFromHomepage.php +++ /dev/null @@ -1,18 +0,0 @@ -page = $page; - } -} \ No newline at end of file diff --git a/templates/Base/OnePage/Handlers/OnePage.php b/templates/Base/OnePage/Handlers/OnePage.php deleted file mode 100644 index 39acbad9..00000000 --- a/templates/Base/OnePage/Handlers/OnePage.php +++ /dev/null @@ -1,188 +0,0 @@ -route('template.setHomepage', trans('template::admin/mainMenu.setHomepage'), [], 1, ['icon' => 'fa fa-fw fa-home']); - } - - /** - * Getter for pages displayed on homepage - * - * @return array - */ - public static function getPagesOnHomepage() - { - if (!self::$homepagePagesInitialized) { - $pageIds = (array)json_decode(Settings::get(self::HOMEPAGE_PAGES_SETTINGS_KEY, '[]')); - - if (empty($pageIds)) { - return []; - } - - // get all available pages - $pages = Content::whereIn('id', $pageIds); - - if (Auth::user()) { - $pages = $pages->where('status', '!=', IContent::STATUS_DRAFT); - } else { - $pages = $pages->where('status', IContent::STATUS_PUBLIC); - } - - $homepagePages = $pages->get() - ->getDictionary(); - - foreach ($pageIds as $pageId) { - if (!isset($homepagePages[$pageId])) { - continue; - } - - self::$homepagePages[] = $homepagePages[$pageId]; - } - - self::$homepagePagesInitialized = true; - } - - return self::$homepagePages; - } - - /** - * Prepare Content object to be rendered using Blade template - * - * @param Content $content - * - * @return array - */ - public static function beforeRender(Content & $content) - { - if ($content->isHomepage) { - $pages = self::getPagesOnHomepage(); - - // create real content from pages - $pagesRaw = $pagesInTemplates = []; - foreach ($pages as $page) { - // save pages as models only - $pagesRaw[$page->url] = $page; - - // save rendered pages - try { - $pagesInTemplates[$page->url] = PageRenderer::render($page) - ->render(); - } catch (\Exception $e) { - if (Auth::user()) { - $pagesInTemplates[$page->url] = view(Template::name('errors.cannotRender'), ['page' => $page])->render(); - } - } - } - - // return pages into template - return ['pagesHtml' => $pagesInTemplates, 'pagesRaw' => $pagesRaw]; - } - - return []; - } - - /** - * Install module - */ - public static function install() - { - // register action log types - - $types = [ - [ - 'string_id' => 'pageRemovedFromHomepage', - 'name' => 'template::admin/setHomepage.events.names.removedPage', - 'value' => 'template::admin/setHomepage.events.descriptions.removedPage', - ], - [ - 'string_id' => 'pageAddedIntoHomepage', - 'name' => 'template::admin/setHomepage.events.names.addedPage', - 'value' => 'template::admin/setHomepage.events.descriptions.addedPage', - ], - - ]; - foreach ($types as $type) { - ActionLogType::create($type); - } - - // try to create onepage menu widget - $widgetName = OnePageMenu::getName(); - $widgetDescription = OnePageMenu::getDescription(); - - CurrentTemplate::reset(); - - // create row in widget types - WidgetType::create([ - 'handler' => OnePageMenu::class, - 'name' => $widgetName, - 'module_id' => null, - 'template_id' => CurrentTemplate::get()->id, - 'description' => $widgetDescription - ]); - - $area = WidgetArea::create(['name' => 'Top menu', 'code' => 'topMenu', 'deletable' => 0]); - $widget = Widget::create([ - 'widget_type_handler' => OnePageMenu::class, - 'name' => 'Menu', - 'settings' => '{"containerClass": null}', - 'deletable' => 0 - ]); - - // bind widget with widget area - WidgetInWidgetArea::create(['widget_id' => $widget->id, 'widget_area_id' => $area->id, 'position' => 1]); - } - - /** - * Uninstall template - * - * @param Module $template - */ - public static function uninstall(Module $template) - { - // delete action log types - ActionLogType::whereIn('string_id', ['pageRemovedFromHomepage', 'pageAddedIntoHomepage']) - ->delete(); - - // delete settings with pages on homepage - SettingsModel::where('key', self::HOMEPAGE_PAGES_SETTINGS_KEY) - ->delete(); - } -} \ No newline at end of file diff --git a/templates/Base/OnePage/Http/Controllers/Admin/SetHomepage.php b/templates/Base/OnePage/Http/Controllers/Admin/SetHomepage.php deleted file mode 100644 index 83440001..00000000 --- a/templates/Base/OnePage/Http/Controllers/Admin/SetHomepage.php +++ /dev/null @@ -1,160 +0,0 @@ -content = $content; - } - - /** - * Display form for organizing pages on homepage - * - * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View - */ - public function getPages() - { - // get pages which are assigned as homepage parts - $usedPagesIds = (array)Settings::getJson(OnePage::HOMEPAGE_PAGES_SETTINGS_KEY); - - // get all pages - they will be separated for used and not used on next lines - $allPages = $this->content->getOverview() - ->get(); - - // separate pages to used and not used - with help of $usedPAgesIds array defined above - $pages = $used = $notUsed = []; - $homepage = null; - foreach ($allPages as $page) { - - if ($page->isHomepage) { - $homepage = $page; - continue; - } - - $pages[$page->id] = $page; - - if (in_array($page->id, $usedPagesIds)) { - $used[$page->id] = $page; - } else { - $notUsed[$page->id] = $page; - } - } - - return view('template::admin/homepage.set', [ - 'usedPagesIds' => $usedPagesIds, - 'allPages' => $pages, - 'usedPages' => $used, - 'notUsedPages' => $notUsed, - 'homepage' => $homepage - ]); - } - - /** - * Add page into homepage - * - * @param $id - * - * @return \Illuminate\Http\RedirectResponse - */ - public function addPage($id) - { - $page = $this->content->getOne($id); - - if ($page->isHomepage) { - return redirect() - ->back() - ->with('error', trans('template::admin/setHomepage.cannotSetHomepageAsPartOfHomepage')); - } - - // try to get page config - $settingsEntry = SettingsModel::where('key', OnePage::HOMEPAGE_PAGES_SETTINGS_KEY) - ->where('language', LaravelLocalization::getCurrentLocale()) - ->first(); - - if (!$settingsEntry) { - $settingsEntry = new SettingsModel(); - $settingsEntry->language = LaravelLocalization::getCurrentLocale(); - $settingsEntry->key = OnePage::HOMEPAGE_PAGES_SETTINGS_KEY; - $usedPagesIds = []; - } else { - $usedPagesIds = (array)json_decode($settingsEntry->value); - } - - // add page into list of used pages - if not already there - if (!in_array($id, $usedPagesIds)) { - $usedPagesIds[] = $id; - } - - $settingsEntry->value = json_encode($usedPagesIds); - $settingsEntry->save(); - - // inform other application parts about this event - Event::fire(new AddPageIntoHomepage($page)); - - return redirect() - ->back() - ->with('success', trans('template::admin/setHomepage.successfullyAdded')); - } - - /** - * Remove page from homepage - * - * @param $id - * - * @return \Illuminate\Http\RedirectResponse - */ - public function removePage($id) - { - $pages = (array)Settings::getJson(OnePage::HOMEPAGE_PAGES_SETTINGS_KEY); - - $page = $this->content->getOne($id); - - if (!in_array($id, $pages)) { - return redirect() - ->back() - ->with('error', trans('template::admin/setHomepage.invalidPageId')); - } else { - $pagePosition = array_search($id, $pages); - - // remove page from config array - unset($pages[$pagePosition]); - - $pages = array_values($pages); - - // update in database - SettingsModel::where('key', OnePage::HOMEPAGE_PAGES_SETTINGS_KEY) - ->where('language', LaravelLocalization::getCurrentLocale()) - ->update(['value' => json_encode($pages)]); - - // inform other application parts about this event - Event::fire(new RemovePageFromHomepage($page)); - - return redirect() - ->back() - ->with('success', trans('template::admin/setHomepage.successfullyRemoved')); - } - } -} \ No newline at end of file diff --git a/templates/Base/OnePage/Http/routes.php b/templates/Base/OnePage/Http/routes.php deleted file mode 100644 index 55c87aee..00000000 --- a/templates/Base/OnePage/Http/routes.php +++ /dev/null @@ -1,19 +0,0 @@ - ['admin'], - 'prefix' => \LaravelLocalization::setLocale() . '/admin/template', - 'namespace' => 'Templates\Base\OnePage\Http\Controllers\Admin' - ], function () { - - // display form for selecting pages for homepage - Route::get('homepage', 'SetHomepage@getPages') - ->name('template.setHomepage'); - - // add page into homepage - Route::get('add/{id}', 'SetHomepage@addPage') - ->name('template.homepage.addPage'); - - // delete page from homepage - Route::get('remove/{id}', 'SetHomepage@removePage') - ->name('template.homepage.removePage'); -}); \ No newline at end of file diff --git a/templates/Base/OnePage/Listeners/HomepageChanged.php b/templates/Base/OnePage/Listeners/HomepageChanged.php deleted file mode 100644 index bd5ac2a8..00000000 --- a/templates/Base/OnePage/Listeners/HomepageChanged.php +++ /dev/null @@ -1,37 +0,0 @@ -page->id, $pagesOnHomepage)) { - $position = array_search($event->page->id, $pagesOnHomepage); - - unset($pagesOnHomepage[$position]); - - $pages = array_values($pagesOnHomepage); - - $settings = SettingsModel::where('key', OnePage::HOMEPAGE_PAGES_SETTINGS_KEY) - ->where('language', \LaravelLocalization::getCurrentLocale()); - - // update in database - if (!empty($pages)) { - $settings->update(['value' => json_encode($pages)]); - } else { - $settings->delete(); - } - } - } -} \ No newline at end of file diff --git a/templates/Base/OnePage/Listeners/Loggers/LogAddingPage.php b/templates/Base/OnePage/Listeners/Loggers/LogAddingPage.php deleted file mode 100644 index 67bb113a..00000000 --- a/templates/Base/OnePage/Listeners/Loggers/LogAddingPage.php +++ /dev/null @@ -1,23 +0,0 @@ - $event->page->id, - 'title' => $event->page->title - ]; - - $this->saveLog($parameters); - } - - protected function getName() - { - return 'pageAddedIntoHomepage'; - } -} \ No newline at end of file diff --git a/templates/Base/OnePage/Listeners/Loggers/LogRemovingPage.php b/templates/Base/OnePage/Listeners/Loggers/LogRemovingPage.php deleted file mode 100644 index f862f115..00000000 --- a/templates/Base/OnePage/Listeners/Loggers/LogRemovingPage.php +++ /dev/null @@ -1,23 +0,0 @@ - $event->page->id, - 'title' => $event->page->title - ]; - - $this->saveLog($parameters); - } - - protected function getName() - { - return 'pageRemovedFromHomepage'; - } -} \ No newline at end of file diff --git a/templates/Base/OnePage/Providers/EventProvider.php b/templates/Base/OnePage/Providers/EventProvider.php deleted file mode 100644 index 7f6c9bbc..00000000 --- a/templates/Base/OnePage/Providers/EventProvider.php +++ /dev/null @@ -1,19 +0,0 @@ - [HomepageChanged::class], - AddPageIntoHomepage::class => [LogAddingPage::class], - RemovePageFromHomepage::class => [LogRemovingPage::class], - ]; -} \ No newline at end of file diff --git a/templates/Base/OnePage/Providers/OnePageTemplate.php b/templates/Base/OnePage/Providers/OnePageTemplate.php deleted file mode 100644 index 6de33b5c..00000000 --- a/templates/Base/OnePage/Providers/OnePageTemplate.php +++ /dev/null @@ -1,58 +0,0 @@ -registerTranslations(); - } - - public function boot() - { - $this->registerViews(); - $this->registerWidgets(); - - // register event service provider for this template - $this->app->register(EventProvider::class); - } - - /** - * Register translations used in this base template - */ - private function registerTranslations() - { - // register translations - $this->loadTranslationsFrom(__DIR__ . '/../Resources/lang', 'template'); - } - - /** - * Register views used in this template - both visitor's and admin's - */ - private function registerViews() - { - // load views - $this->loadViewsFrom(array_merge(array_map(function ($path) { - return $path; - }, \Config::get('view.paths')), [__DIR__ . '/../Resources/views']), 'template'); - } - - /** - * Register all widgets related to this template - */ - private function registerWidgets() - { - $registrator = $this->app->make('registerWidget'); - - // register all available widgets - $registrator->register(OnePageMenu::class); - } -} \ No newline at end of file diff --git a/templates/Base/OnePage/Resources/lang/cs/admin/mainMenu.php b/templates/Base/OnePage/Resources/lang/cs/admin/mainMenu.php deleted file mode 100644 index 89c2e5c5..00000000 --- a/templates/Base/OnePage/Resources/lang/cs/admin/mainMenu.php +++ /dev/null @@ -1,5 +0,0 @@ - "Nastavení hlavní stránky", -"templateName" => "Jednostránkovka", -]; diff --git a/templates/Base/OnePage/Resources/lang/cs/admin/setHomepage.php b/templates/Base/OnePage/Resources/lang/cs/admin/setHomepage.php deleted file mode 100644 index 0a06cf67..00000000 --- a/templates/Base/OnePage/Resources/lang/cs/admin/setHomepage.php +++ /dev/null @@ -1,23 +0,0 @@ - "Přidat stránku na homepage", -"cannotSetHomepageAsPartOfHomepage" => "No toto? Jak mám nastavit domovskou stárnku jako podstránku sama sebe?", -"events" => ["descriptions" => ["addedPage" => 'Na domovskou stránku byla přidána stránka #:id s titulkem ":title"', -"removedPage" => 'Z domovské stránky byla odebrána stránka #:id ":title"', -], -"names" => ["addedPage" => "Stránka přidána na titulní stranu.", -"removedPage" => "Stránka odebrána z titulní strany.", -], -], -"invalidPageId" => "Nelze odebrat stránku z titulní strany, neboť uvedené ID neexistuje.", -"noHomepageSet" => "Není nastavena domovská stránka, následující nastavení se nikde neprojeví!", -"noPagesAvailable" => "Žádné stránky k dispozici.", -"noPagesSelected" => "Nebyla vybrána žádná stránka pro zobrazení na titulní straně. Zatím...", -"notUsedPages" => "Nepoužité stránky", -"pageDescription" => "Na této stránce můžete nastavit stránky, které se mají zobrazovat na titulní strane.", -"reallyRemovePage" => "Opravdu chcete odebrat stránku y hlavní stránky?", -"successfullyAdded" => "Stránka úspěšně přidána na úvodní stranu", -"successfullyRemoved" => "Stránka úspěšně odebrána z úvodní stránky.", -"title" => "Nastavení úvodní stránky", -"usedPages" => "Použité stránky", -]; diff --git a/templates/Base/OnePage/Resources/lang/cs/widget/menu.php b/templates/Base/OnePage/Resources/lang/cs/widget/menu.php deleted file mode 100644 index 48a23882..00000000 --- a/templates/Base/OnePage/Resources/lang/cs/widget/menu.php +++ /dev/null @@ -1,11 +0,0 @@ - "Jednoduché menu použité pro navigaci v jednostránkovém webu. Pro přechody mezi stránkami používá anchor odkazy na stránky. Ty se generují automaticky ze seznamu stránek přidaných na homepage.", -"form" => ["containerClass" => "HTML třída obalového elementu", -"description" => "Popis", -"name" => "Název menu", -"save" => "Uložit", -], -"name" => "Jednstránkové menu", -"new" => "Vytvořit nové menu", -]; diff --git a/templates/Base/OnePage/Resources/lang/en/admin/mainMenu.php b/templates/Base/OnePage/Resources/lang/en/admin/mainMenu.php deleted file mode 100644 index 9f102eeb..00000000 --- a/templates/Base/OnePage/Resources/lang/en/admin/mainMenu.php +++ /dev/null @@ -1,5 +0,0 @@ - 'Homepage settings', - 'templateName' => 'Onepager' -]; \ No newline at end of file diff --git a/templates/Base/OnePage/Resources/lang/en/admin/setHomepage.php b/templates/Base/OnePage/Resources/lang/en/admin/setHomepage.php deleted file mode 100644 index 1609b533..00000000 --- a/templates/Base/OnePage/Resources/lang/en/admin/setHomepage.php +++ /dev/null @@ -1,26 +0,0 @@ - 'Homepage setup', - 'pageDescription' => 'On this page you can setup all pages which should appear on homepage. Use drag\'n\'drop feature and organize your pages into your presentation.', - 'noPagesSelected' => 'No pages selected for homepage. Yet...', - 'noPagesAvailable' => 'There are no pages you could set up for homepage.', - 'successfullyAdded' => 'Page successfully added to homepage.', - 'successfullyRemoved' => 'Page successfully removed from homepage.', - 'invalidPageId' => 'Cannot remove page from homepage, because given ID does not exist.', - 'usedPages' => 'Used pages', - 'notUsedPages' => 'Not used pages', - 'reallyRemovePage' => 'Do you really want to remove this page from homepage?', - 'cannotSetHomepageAsPartOfHomepage' => 'Cannot set currently set homepage as one of homepage pages.', - 'noHomepageSet' => 'No homepage set, following settings will not take effect!', - 'addToHomepage' => 'Add page into homepage', - 'events' => [ - 'names' => [ - 'removedPage' => 'Removed page from homepage', - 'addedPage' => 'Added page into homepage' - ], - 'descriptions' => [ - 'removedPage' => 'Removed page #:id ":title" from homepage.', - 'addedPage' => 'Added page #:id ":title" into homepage.' - ] - ] -]; \ No newline at end of file diff --git a/templates/Base/OnePage/Resources/lang/en/widget/menu.php b/templates/Base/OnePage/Resources/lang/en/widget/menu.php deleted file mode 100644 index 04a5c5c8..00000000 --- a/templates/Base/OnePage/Resources/lang/en/widget/menu.php +++ /dev/null @@ -1,12 +0,0 @@ - 'One page menu', - 'description' => 'Simple menu used for one page templates. This menu navigates using nachor links on page. Links are generated automatically using list of pages on homepage.', - 'new' => 'Create new menu', - 'form' => [ - 'name' => 'Menu name', - 'description' => 'Description', - 'containerClass' => 'HTML class for container element', - 'save' => 'Save', - ] -]; \ No newline at end of file diff --git a/templates/Base/OnePage/Resources/views/admin/homepage/set.blade.php b/templates/Base/OnePage/Resources/views/admin/homepage/set.blade.php deleted file mode 100644 index cfa6d1bc..00000000 --- a/templates/Base/OnePage/Resources/views/admin/homepage/set.blade.php +++ /dev/null @@ -1,90 +0,0 @@ -@extends('admin.layoutWithNavigation') - -@section('pageHeading', trans('template::admin/setHomepage.title')) -@section('pageDescription', trans('template::admin/setHomepage.pageDescription')) - -{{-- -Improvement: http://www.html5rocks.com/en/tutorials/dnd/basics/ ---}} - -@section('content') - -
    -
    - @if(isset($homepage)) - @include('admin.snippets.card', [ - 'type' => 'primary', - 'title' => $homepage->title.' '.trans($homepage->module_name).'', - 'body' => '

    '.str_limit(strip_tags($homepage->content), 200).'

    ', - 'footerClass' => 'text-right', - 'footer' => '' - ]) - @else -
    @lang('template::admin/setHomepage.noHomepageSet')
    - @endif - -

    @lang('template::admin/setHomepage.usedPages')

    - - @forelse($usedPagesIds as $pageId) - - {{--ignore non-existing pages--}} - @if(!isset($allPages[$pageId])) - @continue - @endif - - - @include('admin.snippets.card', [ - 'title' => $allPages[$pageId]->title.' '.trans($allPages[$pageId]->module_name).'', - 'body' => '

    '.str_limit(strip_tags($allPages[$pageId]->content), 200).'

    ', - 'footerClass' => 'text-right', - 'footer' => ' - - - ' - ]) - @empty -
    - @lang('template::admin/setHomepage.noPagesSelected') -
    - @endforelse -
    -
    -

    @lang('template::admin/setHomepage.notUsedPages')

    - @forelse($notUsedPages as $page) -
    -
    -
    -

    {{$page->title}} - @lang($page->module_name) -

    -
    -
    -
    - {{str_limit(strip_tags($page->content), 100)}} -
    - -
    - @empty -
    - @lang('template::admin/setHomepage.noPagesAvailable') -
    - @endforelse -
    -
    - -@endsection \ No newline at end of file diff --git a/templates/Base/OnePage/Resources/views/admin/widgets/onePageMenu/edit.blade.php b/templates/Base/OnePage/Resources/views/admin/widgets/onePageMenu/edit.blade.php deleted file mode 100644 index f4dbc2cd..00000000 --- a/templates/Base/OnePage/Resources/views/admin/widgets/onePageMenu/edit.blade.php +++ /dev/null @@ -1,15 +0,0 @@ -@extends('admin.layoutWithNavigation') - -@section('pageHeading', @trans('widgets/htmlCode.edit', ['name' => $widget->name])) - -@section('content') -
    - @include('template::admin.widgets.onePageMenu.form', ['action' => route('widgets.postEdit', ['id' => $widget->id])]) -
    -
    -

    @lang('widgets/menu.preview')

    - - @widgetPreview($widget) -
    -@stop - diff --git a/templates/Base/OnePage/Resources/views/admin/widgets/onePageMenu/form.blade.php b/templates/Base/OnePage/Resources/views/admin/widgets/onePageMenu/form.blade.php deleted file mode 100644 index 94d02c07..00000000 --- a/templates/Base/OnePage/Resources/views/admin/widgets/onePageMenu/form.blade.php +++ /dev/null @@ -1,27 +0,0 @@ -
    - {!! csrf_field() !!} - - - - - - - - - - - - - -
    \ No newline at end of file diff --git a/templates/Base/OnePage/Resources/views/admin/widgets/onePageMenu/new.blade.php b/templates/Base/OnePage/Resources/views/admin/widgets/onePageMenu/new.blade.php deleted file mode 100644 index 426b2db2..00000000 --- a/templates/Base/OnePage/Resources/views/admin/widgets/onePageMenu/new.blade.php +++ /dev/null @@ -1,9 +0,0 @@ -@extends('admin.layoutWithNavigation') - -@section('pageHeading', @trans('template::widget/menu.new')) -@section('pageDescription', @trans($type->description)) - -@section('content') - @include('template::admin.widgets.onePageMenu.form', ['action' => route('widgets.postNew', ['type' => $type->id])]) -@stop - diff --git a/templates/Base/OnePage/Widgets/OnePageMenu/OnePageMenu.php b/templates/Base/OnePage/Widgets/OnePageMenu/OnePageMenu.php deleted file mode 100644 index 28f2e46f..00000000 --- a/templates/Base/OnePage/Widgets/OnePageMenu/OnePageMenu.php +++ /dev/null @@ -1,49 +0,0 @@ - $pages, 'widget' => $widget])->render(); - } - - /** - * Display form for creating new instance of widget - * - * @param WidgetType $type - * - * @return mixed - */ - public static function renderAddForm(WidgetType $type) - { - return view('template::admin.widgets.onePageMenu.new', [ - 'type' => $type, - 'widget' => new Widget(), - 'settings' => new \stdClass() - ]); - } - - /** - * Display form for editing already existing widget - * - * @param Widget $widget - * - * @return mixed - */ - public static function renderEditForm(Widget $widget) - { - $settings = $widget->settings; - return view('template::admin.widgets.onePageMenu.edit', ['widget' => $widget, 'settings' => $settings]); - } -} diff --git a/templates/Base/OnePage/config.php b/templates/Base/OnePage/config.php deleted file mode 100644 index a94cf0f9..00000000 --- a/templates/Base/OnePage/config.php +++ /dev/null @@ -1,8 +0,0 @@ - [\Templates\Base\OnePage\Providers\OnePageTemplate::class], - 'files' => [__DIR__ . '/Http/routes.php'], - 'handler' => null, - 'name' => null, - 'description' => null, -]; diff --git a/templates/Binarity/Handler.php b/templates/Binarity/Handler.php deleted file mode 100644 index 8b4e98e0..00000000 --- a/templates/Binarity/Handler.php +++ /dev/null @@ -1,85 +0,0 @@ - 0, 'code' => 'mainMenu', 'name' => 'Menu']); - } - - /** - * Uninstall template - * - * Delete some items in database, delete files etc. - * - * @param Module $template - */ - public static function uninstall(Module $template) - { - WidgetArea::where('code', 'mainMenu') - ->delete(); - } - - /** - * Get list of registered templates and supported modules. - * - * Returned array is expected to be array of arrays with following items: module, namespace and templateName. - * Example: - * return [ - * ['module' => 'Article', 'templateName' => 'article::template.name'] - * ]; - * - * When no "namespace" is specified, value strtolower(module) is used instaed. - * - * @return array - */ - public static function getPublicTemplatePaths() - { - return [ - [ - 'module' => 'StaticPages', - 'templateName' => 'staticpages::admin.templatePath' - ], - [ - 'module' => 'ContactForm', - 'templateName' => 'contactform::admin/adminMenu.templatePath' - ], - [ - 'module' => 'ArticleList', - 'alias' => 'blog-articlelist', - 'templateName' => 'articlelist::module.templatePath' - ], - [ - 'module' => 'Article', - 'alias' => 'blog-article', - 'templateName' => 'article::module.templatePath' - ], - ]; - } -} \ No newline at end of file diff --git a/templates/Binarity/Providers/ServiceProvider.php b/templates/Binarity/Providers/ServiceProvider.php deleted file mode 100644 index 63a5dd58..00000000 --- a/templates/Binarity/Providers/ServiceProvider.php +++ /dev/null @@ -1,22 +0,0 @@ -'); - background-size: 9px 6px; - background-position: right center; - background-origin: content-box; - background-repeat: no-repeat; -} -#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object,.mqa-display img,.mqa-display embed,.mqa-display object { - max-width: none !important; -} -[data-whatinput='mouse'] button { - outline: 0; -} -.is-visible { - display: block !important; -} -.is-hidden { - display: none !important; -} -.row { - max-width: 75rem; - margin-left: auto; - margin-right: auto; -} -.row::before,.row::after { - content: ' '; - display: table; -} -.row::after { - clear: both; -} -.row.collapse > .column,.row.collapse > .columns { - padding-left: 0; - padding-right: 0; -} -.row .row { - max-width: none; - margin-left: -0.625rem; - margin-right: -0.625rem; -} - -@media screen and (min-width: 40em) { - - .row .row { - margin-left: -0.9375rem; - margin-right: -0.9375rem; - } -} - -.row .row.collapse { - margin-left: 0; - margin-right: 0; -} -.row.expanded { - max-width: none; -} -.row.expanded .row { - margin-left: auto; - margin-right: auto; -} -.column,.columns { - width: 100%; - float: left; - padding-left: 0.625rem; - padding-right: 0.625rem; -} - -@media screen and (min-width: 40em) { - - .column,.columns { - padding-left: 0.9375rem; - padding-right: 0.9375rem; - } -} - -.column:last-child:not(:first-child),.columns:last-child:not(:first-child) { - float: right; -} -.column.end:last-child:last-child,.end.columns:last-child:last-child { - float: left; -} -.column.row.row,.row.row.columns { - float: none; -} -.row .column.row.row,.row .row.row.columns { - padding-left: 0; - padding-right: 0; - margin-left: 0; - margin-right: 0; -} -.small-1 { - width: 8.33333%; -} -.small-push-1 { - position: relative; - left: 8.33333%; -} -.small-pull-1 { - position: relative; - left: -8.33333%; -} -.small-offset-0 { - margin-left: 0%; -} -.small-2 { - width: 16.66667%; -} -.small-push-2 { - position: relative; - left: 16.66667%; -} -.small-pull-2 { - position: relative; - left: -16.66667%; -} -.small-offset-1 { - margin-left: 8.33333%; -} -.small-3 { - width: 25%; -} -.small-push-3 { - position: relative; - left: 25%; -} -.small-pull-3 { - position: relative; - left: -25%; -} -.small-offset-2 { - margin-left: 16.66667%; -} -.small-4 { - width: 33.33333%; -} -.small-push-4 { - position: relative; - left: 33.33333%; -} -.small-pull-4 { - position: relative; - left: -33.33333%; -} -.small-offset-3 { - margin-left: 25%; -} -.small-5 { - width: 41.66667%; -} -.small-push-5 { - position: relative; - left: 41.66667%; -} -.small-pull-5 { - position: relative; - left: -41.66667%; -} -.small-offset-4 { - margin-left: 33.33333%; -} -.small-6 { - width: 50%; -} -.small-push-6 { - position: relative; - left: 50%; -} -.small-pull-6 { - position: relative; - left: -50%; -} -.small-offset-5 { - margin-left: 41.66667%; -} -.small-7 { - width: 58.33333%; -} -.small-push-7 { - position: relative; - left: 58.33333%; -} -.small-pull-7 { - position: relative; - left: -58.33333%; -} -.small-offset-6 { - margin-left: 50%; -} -.small-8 { - width: 66.66667%; -} -.small-push-8 { - position: relative; - left: 66.66667%; -} -.small-pull-8 { - position: relative; - left: -66.66667%; -} -.small-offset-7 { - margin-left: 58.33333%; -} -.small-9 { - width: 75%; -} -.small-push-9 { - position: relative; - left: 75%; -} -.small-pull-9 { - position: relative; - left: -75%; -} -.small-offset-8 { - margin-left: 66.66667%; -} -.small-10 { - width: 83.33333%; -} -.small-push-10 { - position: relative; - left: 83.33333%; -} -.small-pull-10 { - position: relative; - left: -83.33333%; -} -.small-offset-9 { - margin-left: 75%; -} -.small-11 { - width: 91.66667%; -} -.small-push-11 { - position: relative; - left: 91.66667%; -} -.small-pull-11 { - position: relative; - left: -91.66667%; -} -.small-offset-10 { - margin-left: 83.33333%; -} -.small-12 { - width: 100%; -} -.small-offset-11 { - margin-left: 91.66667%; -} -.small-up-1 > .column,.small-up-1 > .columns { - width: 100%; - float: left; -} -.small-up-1 > .column:nth-of-type(1n),.small-up-1 > .columns:nth-of-type(1n) { - clear: none; -} -.small-up-1 > .column:nth-of-type(1n+1),.small-up-1 > .columns:nth-of-type(1n+1) { - clear: both; -} -.small-up-1 > .column:last-child,.small-up-1 > .columns:last-child { - float: left; -} -.small-up-2 > .column,.small-up-2 > .columns { - width: 50%; - float: left; -} -.small-up-2 > .column:nth-of-type(1n),.small-up-2 > .columns:nth-of-type(1n) { - clear: none; -} -.small-up-2 > .column:nth-of-type(2n+1),.small-up-2 > .columns:nth-of-type(2n+1) { - clear: both; -} -.small-up-2 > .column:last-child,.small-up-2 > .columns:last-child { - float: left; -} -.small-up-3 > .column,.small-up-3 > .columns { - width: 33.33333%; - float: left; -} -.small-up-3 > .column:nth-of-type(1n),.small-up-3 > .columns:nth-of-type(1n) { - clear: none; -} -.small-up-3 > .column:nth-of-type(3n+1),.small-up-3 > .columns:nth-of-type(3n+1) { - clear: both; -} -.small-up-3 > .column:last-child,.small-up-3 > .columns:last-child { - float: left; -} -.small-up-4 > .column,.small-up-4 > .columns { - width: 25%; - float: left; -} -.small-up-4 > .column:nth-of-type(1n),.small-up-4 > .columns:nth-of-type(1n) { - clear: none; -} -.small-up-4 > .column:nth-of-type(4n+1),.small-up-4 > .columns:nth-of-type(4n+1) { - clear: both; -} -.small-up-4 > .column:last-child,.small-up-4 > .columns:last-child { - float: left; -} -.small-up-5 > .column,.small-up-5 > .columns { - width: 20%; - float: left; -} -.small-up-5 > .column:nth-of-type(1n),.small-up-5 > .columns:nth-of-type(1n) { - clear: none; -} -.small-up-5 > .column:nth-of-type(5n+1),.small-up-5 > .columns:nth-of-type(5n+1) { - clear: both; -} -.small-up-5 > .column:last-child,.small-up-5 > .columns:last-child { - float: left; -} -.small-up-6 > .column,.small-up-6 > .columns { - width: 16.66667%; - float: left; -} -.small-up-6 > .column:nth-of-type(1n),.small-up-6 > .columns:nth-of-type(1n) { - clear: none; -} -.small-up-6 > .column:nth-of-type(6n+1),.small-up-6 > .columns:nth-of-type(6n+1) { - clear: both; -} -.small-up-6 > .column:last-child,.small-up-6 > .columns:last-child { - float: left; -} -.small-up-7 > .column,.small-up-7 > .columns { - width: 14.28571%; - float: left; -} -.small-up-7 > .column:nth-of-type(1n),.small-up-7 > .columns:nth-of-type(1n) { - clear: none; -} -.small-up-7 > .column:nth-of-type(7n+1),.small-up-7 > .columns:nth-of-type(7n+1) { - clear: both; -} -.small-up-7 > .column:last-child,.small-up-7 > .columns:last-child { - float: left; -} -.small-up-8 > .column,.small-up-8 > .columns { - width: 12.5%; - float: left; -} -.small-up-8 > .column:nth-of-type(1n),.small-up-8 > .columns:nth-of-type(1n) { - clear: none; -} -.small-up-8 > .column:nth-of-type(8n+1),.small-up-8 > .columns:nth-of-type(8n+1) { - clear: both; -} -.small-up-8 > .column:last-child,.small-up-8 > .columns:last-child { - float: left; -} -.small-collapse > .column,.small-collapse > .columns { - padding-left: 0; - padding-right: 0; -} -.small-collapse .row { - margin-left: 0; - margin-right: 0; -} -.small-uncollapse > .column,.small-uncollapse > .columns { - padding-left: 0.625rem; - padding-right: 0.625rem; -} -.small-centered { - float: none; - margin-left: auto; - margin-right: auto; -} -.small-uncentered,.small-push-0,.small-pull-0 { - position: static; - margin-left: 0; - margin-right: 0; - float: left; -} - -@media screen and (min-width: 40em) { - - .medium-1 { - width: 8.33333%; - } - .medium-push-1 { - position: relative; - left: 8.33333%; - } - .medium-pull-1 { - position: relative; - left: -8.33333%; - } - .medium-offset-0 { - margin-left: 0%; - } - .medium-2 { - width: 16.66667%; - } - .medium-push-2 { - position: relative; - left: 16.66667%; - } - .medium-pull-2 { - position: relative; - left: -16.66667%; - } - .medium-offset-1 { - margin-left: 8.33333%; - } - .medium-3 { - width: 25%; - } - .medium-push-3 { - position: relative; - left: 25%; - } - .medium-pull-3 { - position: relative; - left: -25%; - } - .medium-offset-2 { - margin-left: 16.66667%; - } - .medium-4 { - width: 33.33333%; - } - .medium-push-4 { - position: relative; - left: 33.33333%; - } - .medium-pull-4 { - position: relative; - left: -33.33333%; - } - .medium-offset-3 { - margin-left: 25%; - } - .medium-5 { - width: 41.66667%; - } - .medium-push-5 { - position: relative; - left: 41.66667%; - } - .medium-pull-5 { - position: relative; - left: -41.66667%; - } - .medium-offset-4 { - margin-left: 33.33333%; - } - .medium-6 { - width: 50%; - } - .medium-push-6 { - position: relative; - left: 50%; - } - .medium-pull-6 { - position: relative; - left: -50%; - } - .medium-offset-5 { - margin-left: 41.66667%; - } - .medium-7 { - width: 58.33333%; - } - .medium-push-7 { - position: relative; - left: 58.33333%; - } - .medium-pull-7 { - position: relative; - left: -58.33333%; - } - .medium-offset-6 { - margin-left: 50%; - } - .medium-8 { - width: 66.66667%; - } - .medium-push-8 { - position: relative; - left: 66.66667%; - } - .medium-pull-8 { - position: relative; - left: -66.66667%; - } - .medium-offset-7 { - margin-left: 58.33333%; - } - .medium-9 { - width: 75%; - } - .medium-push-9 { - position: relative; - left: 75%; - } - .medium-pull-9 { - position: relative; - left: -75%; - } - .medium-offset-8 { - margin-left: 66.66667%; - } - .medium-10 { - width: 83.33333%; - } - .medium-push-10 { - position: relative; - left: 83.33333%; - } - .medium-pull-10 { - position: relative; - left: -83.33333%; - } - .medium-offset-9 { - margin-left: 75%; - } - .medium-11 { - width: 91.66667%; - } - .medium-push-11 { - position: relative; - left: 91.66667%; - } - .medium-pull-11 { - position: relative; - left: -91.66667%; - } - .medium-offset-10 { - margin-left: 83.33333%; - } - .medium-12 { - width: 100%; - } - .medium-offset-11 { - margin-left: 91.66667%; - } - .medium-up-1 > .column,.medium-up-1 > .columns { - width: 100%; - float: left; - } - .medium-up-1 > .column:nth-of-type(1n),.medium-up-1 > .columns:nth-of-type(1n) { - clear: none; - } - .medium-up-1 > .column:nth-of-type(1n+1),.medium-up-1 > .columns:nth-of-type(1n+1) { - clear: both; - } - .medium-up-1 > .column:last-child,.medium-up-1 > .columns:last-child { - float: left; - } - .medium-up-2 > .column,.medium-up-2 > .columns { - width: 50%; - float: left; - } - .medium-up-2 > .column:nth-of-type(1n),.medium-up-2 > .columns:nth-of-type(1n) { - clear: none; - } - .medium-up-2 > .column:nth-of-type(2n+1),.medium-up-2 > .columns:nth-of-type(2n+1) { - clear: both; - } - .medium-up-2 > .column:last-child,.medium-up-2 > .columns:last-child { - float: left; - } - .medium-up-3 > .column,.medium-up-3 > .columns { - width: 33.33333%; - float: left; - } - .medium-up-3 > .column:nth-of-type(1n),.medium-up-3 > .columns:nth-of-type(1n) { - clear: none; - } - .medium-up-3 > .column:nth-of-type(3n+1),.medium-up-3 > .columns:nth-of-type(3n+1) { - clear: both; - } - .medium-up-3 > .column:last-child,.medium-up-3 > .columns:last-child { - float: left; - } - .medium-up-4 > .column,.medium-up-4 > .columns { - width: 25%; - float: left; - } - .medium-up-4 > .column:nth-of-type(1n),.medium-up-4 > .columns:nth-of-type(1n) { - clear: none; - } - .medium-up-4 > .column:nth-of-type(4n+1),.medium-up-4 > .columns:nth-of-type(4n+1) { - clear: both; - } - .medium-up-4 > .column:last-child,.medium-up-4 > .columns:last-child { - float: left; - } - .medium-up-5 > .column,.medium-up-5 > .columns { - width: 20%; - float: left; - } - .medium-up-5 > .column:nth-of-type(1n),.medium-up-5 > .columns:nth-of-type(1n) { - clear: none; - } - .medium-up-5 > .column:nth-of-type(5n+1),.medium-up-5 > .columns:nth-of-type(5n+1) { - clear: both; - } - .medium-up-5 > .column:last-child,.medium-up-5 > .columns:last-child { - float: left; - } - .medium-up-6 > .column,.medium-up-6 > .columns { - width: 16.66667%; - float: left; - } - .medium-up-6 > .column:nth-of-type(1n),.medium-up-6 > .columns:nth-of-type(1n) { - clear: none; - } - .medium-up-6 > .column:nth-of-type(6n+1),.medium-up-6 > .columns:nth-of-type(6n+1) { - clear: both; - } - .medium-up-6 > .column:last-child,.medium-up-6 > .columns:last-child { - float: left; - } - .medium-up-7 > .column,.medium-up-7 > .columns { - width: 14.28571%; - float: left; - } - .medium-up-7 > .column:nth-of-type(1n),.medium-up-7 > .columns:nth-of-type(1n) { - clear: none; - } - .medium-up-7 > .column:nth-of-type(7n+1),.medium-up-7 > .columns:nth-of-type(7n+1) { - clear: both; - } - .medium-up-7 > .column:last-child,.medium-up-7 > .columns:last-child { - float: left; - } - .medium-up-8 > .column,.medium-up-8 > .columns { - width: 12.5%; - float: left; - } - .medium-up-8 > .column:nth-of-type(1n),.medium-up-8 > .columns:nth-of-type(1n) { - clear: none; - } - .medium-up-8 > .column:nth-of-type(8n+1),.medium-up-8 > .columns:nth-of-type(8n+1) { - clear: both; - } - .medium-up-8 > .column:last-child,.medium-up-8 > .columns:last-child { - float: left; - } - .medium-collapse > .column,.medium-collapse > .columns { - padding-left: 0; - padding-right: 0; - } - .medium-collapse .row { - margin-left: 0; - margin-right: 0; - } - .medium-uncollapse > .column,.medium-uncollapse > .columns { - padding-left: 0.9375rem; - padding-right: 0.9375rem; - } - .medium-centered { - float: none; - margin-left: auto; - margin-right: auto; - } - .medium-uncentered,.medium-push-0,.medium-pull-0 { - position: static; - margin-left: 0; - margin-right: 0; - float: left; - } -} - - -@media screen and (min-width: 64em) { - - .large-1 { - width: 8.33333%; - } - .large-push-1 { - position: relative; - left: 8.33333%; - } - .large-pull-1 { - position: relative; - left: -8.33333%; - } - .large-offset-0 { - margin-left: 0%; - } - .large-2 { - width: 16.66667%; - } - .large-push-2 { - position: relative; - left: 16.66667%; - } - .large-pull-2 { - position: relative; - left: -16.66667%; - } - .large-offset-1 { - margin-left: 8.33333%; - } - .large-3 { - width: 25%; - } - .large-push-3 { - position: relative; - left: 25%; - } - .large-pull-3 { - position: relative; - left: -25%; - } - .large-offset-2 { - margin-left: 16.66667%; - } - .large-4 { - width: 33.33333%; - } - .large-push-4 { - position: relative; - left: 33.33333%; - } - .large-pull-4 { - position: relative; - left: -33.33333%; - } - .large-offset-3 { - margin-left: 25%; - } - .large-5 { - width: 41.66667%; - } - .large-push-5 { - position: relative; - left: 41.66667%; - } - .large-pull-5 { - position: relative; - left: -41.66667%; - } - .large-offset-4 { - margin-left: 33.33333%; - } - .large-6 { - width: 50%; - } - .large-push-6 { - position: relative; - left: 50%; - } - .large-pull-6 { - position: relative; - left: -50%; - } - .large-offset-5 { - margin-left: 41.66667%; - } - .large-7 { - width: 58.33333%; - } - .large-push-7 { - position: relative; - left: 58.33333%; - } - .large-pull-7 { - position: relative; - left: -58.33333%; - } - .large-offset-6 { - margin-left: 50%; - } - .large-8 { - width: 66.66667%; - } - .large-push-8 { - position: relative; - left: 66.66667%; - } - .large-pull-8 { - position: relative; - left: -66.66667%; - } - .large-offset-7 { - margin-left: 58.33333%; - } - .large-9 { - width: 75%; - } - .large-push-9 { - position: relative; - left: 75%; - } - .large-pull-9 { - position: relative; - left: -75%; - } - .large-offset-8 { - margin-left: 66.66667%; - } - .large-10 { - width: 83.33333%; - } - .large-push-10 { - position: relative; - left: 83.33333%; - } - .large-pull-10 { - position: relative; - left: -83.33333%; - } - .large-offset-9 { - margin-left: 75%; - } - .large-11 { - width: 91.66667%; - } - .large-push-11 { - position: relative; - left: 91.66667%; - } - .large-pull-11 { - position: relative; - left: -91.66667%; - } - .large-offset-10 { - margin-left: 83.33333%; - } - .large-12 { - width: 100%; - } - .large-offset-11 { - margin-left: 91.66667%; - } - .large-up-1 > .column,.large-up-1 > .columns { - width: 100%; - float: left; - } - .large-up-1 > .column:nth-of-type(1n),.large-up-1 > .columns:nth-of-type(1n) { - clear: none; - } - .large-up-1 > .column:nth-of-type(1n+1),.large-up-1 > .columns:nth-of-type(1n+1) { - clear: both; - } - .large-up-1 > .column:last-child,.large-up-1 > .columns:last-child { - float: left; - } - .large-up-2 > .column,.large-up-2 > .columns { - width: 50%; - float: left; - } - .large-up-2 > .column:nth-of-type(1n),.large-up-2 > .columns:nth-of-type(1n) { - clear: none; - } - .large-up-2 > .column:nth-of-type(2n+1),.large-up-2 > .columns:nth-of-type(2n+1) { - clear: both; - } - .large-up-2 > .column:last-child,.large-up-2 > .columns:last-child { - float: left; - } - .large-up-3 > .column,.large-up-3 > .columns { - width: 33.33333%; - float: left; - } - .large-up-3 > .column:nth-of-type(1n),.large-up-3 > .columns:nth-of-type(1n) { - clear: none; - } - .large-up-3 > .column:nth-of-type(3n+1),.large-up-3 > .columns:nth-of-type(3n+1) { - clear: both; - } - .large-up-3 > .column:last-child,.large-up-3 > .columns:last-child { - float: left; - } - .large-up-4 > .column,.large-up-4 > .columns { - width: 25%; - float: left; - } - .large-up-4 > .column:nth-of-type(1n),.large-up-4 > .columns:nth-of-type(1n) { - clear: none; - } - .large-up-4 > .column:nth-of-type(4n+1),.large-up-4 > .columns:nth-of-type(4n+1) { - clear: both; - } - .large-up-4 > .column:last-child,.large-up-4 > .columns:last-child { - float: left; - } - .large-up-5 > .column,.large-up-5 > .columns { - width: 20%; - float: left; - } - .large-up-5 > .column:nth-of-type(1n),.large-up-5 > .columns:nth-of-type(1n) { - clear: none; - } - .large-up-5 > .column:nth-of-type(5n+1),.large-up-5 > .columns:nth-of-type(5n+1) { - clear: both; - } - .large-up-5 > .column:last-child,.large-up-5 > .columns:last-child { - float: left; - } - .large-up-6 > .column,.large-up-6 > .columns { - width: 16.66667%; - float: left; - } - .large-up-6 > .column:nth-of-type(1n),.large-up-6 > .columns:nth-of-type(1n) { - clear: none; - } - .large-up-6 > .column:nth-of-type(6n+1),.large-up-6 > .columns:nth-of-type(6n+1) { - clear: both; - } - .large-up-6 > .column:last-child,.large-up-6 > .columns:last-child { - float: left; - } - .large-up-7 > .column,.large-up-7 > .columns { - width: 14.28571%; - float: left; - } - .large-up-7 > .column:nth-of-type(1n),.large-up-7 > .columns:nth-of-type(1n) { - clear: none; - } - .large-up-7 > .column:nth-of-type(7n+1),.large-up-7 > .columns:nth-of-type(7n+1) { - clear: both; - } - .large-up-7 > .column:last-child,.large-up-7 > .columns:last-child { - float: left; - } - .large-up-8 > .column,.large-up-8 > .columns { - width: 12.5%; - float: left; - } - .large-up-8 > .column:nth-of-type(1n),.large-up-8 > .columns:nth-of-type(1n) { - clear: none; - } - .large-up-8 > .column:nth-of-type(8n+1),.large-up-8 > .columns:nth-of-type(8n+1) { - clear: both; - } - .large-up-8 > .column:last-child,.large-up-8 > .columns:last-child { - float: left; - } - .large-collapse > .column,.large-collapse > .columns { - padding-left: 0; - padding-right: 0; - } - .large-collapse .row { - margin-left: 0; - margin-right: 0; - } - .large-uncollapse > .column,.large-uncollapse > .columns { - padding-left: 0.9375rem; - padding-right: 0.9375rem; - } - .large-centered { - float: none; - margin-left: auto; - margin-right: auto; - } - .large-uncentered,.large-push-0,.large-pull-0 { - position: static; - margin-left: 0; - margin-right: 0; - float: left; - } -} - - -@media screen and (min-width: 75em) { - - .xlarge-1 { - width: 8.33333%; - } - .xlarge-push-1 { - position: relative; - left: 8.33333%; - } - .xlarge-pull-1 { - position: relative; - left: -8.33333%; - } - .xlarge-offset-0 { - margin-left: 0%; - } - .xlarge-2 { - width: 16.66667%; - } - .xlarge-push-2 { - position: relative; - left: 16.66667%; - } - .xlarge-pull-2 { - position: relative; - left: -16.66667%; - } - .xlarge-offset-1 { - margin-left: 8.33333%; - } - .xlarge-3 { - width: 25%; - } - .xlarge-push-3 { - position: relative; - left: 25%; - } - .xlarge-pull-3 { - position: relative; - left: -25%; - } - .xlarge-offset-2 { - margin-left: 16.66667%; - } - .xlarge-4 { - width: 33.33333%; - } - .xlarge-push-4 { - position: relative; - left: 33.33333%; - } - .xlarge-pull-4 { - position: relative; - left: -33.33333%; - } - .xlarge-offset-3 { - margin-left: 25%; - } - .xlarge-5 { - width: 41.66667%; - } - .xlarge-push-5 { - position: relative; - left: 41.66667%; - } - .xlarge-pull-5 { - position: relative; - left: -41.66667%; - } - .xlarge-offset-4 { - margin-left: 33.33333%; - } - .xlarge-6 { - width: 50%; - } - .xlarge-push-6 { - position: relative; - left: 50%; - } - .xlarge-pull-6 { - position: relative; - left: -50%; - } - .xlarge-offset-5 { - margin-left: 41.66667%; - } - .xlarge-7 { - width: 58.33333%; - } - .xlarge-push-7 { - position: relative; - left: 58.33333%; - } - .xlarge-pull-7 { - position: relative; - left: -58.33333%; - } - .xlarge-offset-6 { - margin-left: 50%; - } - .xlarge-8 { - width: 66.66667%; - } - .xlarge-push-8 { - position: relative; - left: 66.66667%; - } - .xlarge-pull-8 { - position: relative; - left: -66.66667%; - } - .xlarge-offset-7 { - margin-left: 58.33333%; - } - .xlarge-9 { - width: 75%; - } - .xlarge-push-9 { - position: relative; - left: 75%; - } - .xlarge-pull-9 { - position: relative; - left: -75%; - } - .xlarge-offset-8 { - margin-left: 66.66667%; - } - .xlarge-10 { - width: 83.33333%; - } - .xlarge-push-10 { - position: relative; - left: 83.33333%; - } - .xlarge-pull-10 { - position: relative; - left: -83.33333%; - } - .xlarge-offset-9 { - margin-left: 75%; - } - .xlarge-11 { - width: 91.66667%; - } - .xlarge-push-11 { - position: relative; - left: 91.66667%; - } - .xlarge-pull-11 { - position: relative; - left: -91.66667%; - } - .xlarge-offset-10 { - margin-left: 83.33333%; - } - .xlarge-12 { - width: 100%; - } - .xlarge-offset-11 { - margin-left: 91.66667%; - } - .xlarge-up-1 > .column,.xlarge-up-1 > .columns { - width: 100%; - float: left; - } - .xlarge-up-1 > .column:nth-of-type(1n),.xlarge-up-1 > .columns:nth-of-type(1n) { - clear: none; - } - .xlarge-up-1 > .column:nth-of-type(1n+1),.xlarge-up-1 > .columns:nth-of-type(1n+1) { - clear: both; - } - .xlarge-up-1 > .column:last-child,.xlarge-up-1 > .columns:last-child { - float: left; - } - .xlarge-up-2 > .column,.xlarge-up-2 > .columns { - width: 50%; - float: left; - } - .xlarge-up-2 > .column:nth-of-type(1n),.xlarge-up-2 > .columns:nth-of-type(1n) { - clear: none; - } - .xlarge-up-2 > .column:nth-of-type(2n+1),.xlarge-up-2 > .columns:nth-of-type(2n+1) { - clear: both; - } - .xlarge-up-2 > .column:last-child,.xlarge-up-2 > .columns:last-child { - float: left; - } - .xlarge-up-3 > .column,.xlarge-up-3 > .columns { - width: 33.33333%; - float: left; - } - .xlarge-up-3 > .column:nth-of-type(1n),.xlarge-up-3 > .columns:nth-of-type(1n) { - clear: none; - } - .xlarge-up-3 > .column:nth-of-type(3n+1),.xlarge-up-3 > .columns:nth-of-type(3n+1) { - clear: both; - } - .xlarge-up-3 > .column:last-child,.xlarge-up-3 > .columns:last-child { - float: left; - } - .xlarge-up-4 > .column,.xlarge-up-4 > .columns { - width: 25%; - float: left; - } - .xlarge-up-4 > .column:nth-of-type(1n),.xlarge-up-4 > .columns:nth-of-type(1n) { - clear: none; - } - .xlarge-up-4 > .column:nth-of-type(4n+1),.xlarge-up-4 > .columns:nth-of-type(4n+1) { - clear: both; - } - .xlarge-up-4 > .column:last-child,.xlarge-up-4 > .columns:last-child { - float: left; - } - .xlarge-up-5 > .column,.xlarge-up-5 > .columns { - width: 20%; - float: left; - } - .xlarge-up-5 > .column:nth-of-type(1n),.xlarge-up-5 > .columns:nth-of-type(1n) { - clear: none; - } - .xlarge-up-5 > .column:nth-of-type(5n+1),.xlarge-up-5 > .columns:nth-of-type(5n+1) { - clear: both; - } - .xlarge-up-5 > .column:last-child,.xlarge-up-5 > .columns:last-child { - float: left; - } - .xlarge-up-6 > .column,.xlarge-up-6 > .columns { - width: 16.66667%; - float: left; - } - .xlarge-up-6 > .column:nth-of-type(1n),.xlarge-up-6 > .columns:nth-of-type(1n) { - clear: none; - } - .xlarge-up-6 > .column:nth-of-type(6n+1),.xlarge-up-6 > .columns:nth-of-type(6n+1) { - clear: both; - } - .xlarge-up-6 > .column:last-child,.xlarge-up-6 > .columns:last-child { - float: left; - } - .xlarge-up-7 > .column,.xlarge-up-7 > .columns { - width: 14.28571%; - float: left; - } - .xlarge-up-7 > .column:nth-of-type(1n),.xlarge-up-7 > .columns:nth-of-type(1n) { - clear: none; - } - .xlarge-up-7 > .column:nth-of-type(7n+1),.xlarge-up-7 > .columns:nth-of-type(7n+1) { - clear: both; - } - .xlarge-up-7 > .column:last-child,.xlarge-up-7 > .columns:last-child { - float: left; - } - .xlarge-up-8 > .column,.xlarge-up-8 > .columns { - width: 12.5%; - float: left; - } - .xlarge-up-8 > .column:nth-of-type(1n),.xlarge-up-8 > .columns:nth-of-type(1n) { - clear: none; - } - .xlarge-up-8 > .column:nth-of-type(8n+1),.xlarge-up-8 > .columns:nth-of-type(8n+1) { - clear: both; - } - .xlarge-up-8 > .column:last-child,.xlarge-up-8 > .columns:last-child { - float: left; - } - .xlarge-collapse > .column,.xlarge-collapse > .columns { - padding-left: 0; - padding-right: 0; - } - .xlarge-collapse .row { - margin-left: 0; - margin-right: 0; - } - .xlarge-uncollapse > .column,.xlarge-uncollapse > .columns { - padding-left: 0.9375rem; - padding-right: 0.9375rem; - } - .xlarge-centered { - float: none; - margin-left: auto; - margin-right: auto; - } - .xlarge-uncentered,.xlarge-push-0,.xlarge-pull-0 { - position: static; - margin-left: 0; - margin-right: 0; - float: left; - } -} - - -@media screen and (min-width: 90em) { - - .xxlarge-1 { - width: 8.33333%; - } - .xxlarge-push-1 { - position: relative; - left: 8.33333%; - } - .xxlarge-pull-1 { - position: relative; - left: -8.33333%; - } - .xxlarge-offset-0 { - margin-left: 0%; - } - .xxlarge-2 { - width: 16.66667%; - } - .xxlarge-push-2 { - position: relative; - left: 16.66667%; - } - .xxlarge-pull-2 { - position: relative; - left: -16.66667%; - } - .xxlarge-offset-1 { - margin-left: 8.33333%; - } - .xxlarge-3 { - width: 25%; - } - .xxlarge-push-3 { - position: relative; - left: 25%; - } - .xxlarge-pull-3 { - position: relative; - left: -25%; - } - .xxlarge-offset-2 { - margin-left: 16.66667%; - } - .xxlarge-4 { - width: 33.33333%; - } - .xxlarge-push-4 { - position: relative; - left: 33.33333%; - } - .xxlarge-pull-4 { - position: relative; - left: -33.33333%; - } - .xxlarge-offset-3 { - margin-left: 25%; - } - .xxlarge-5 { - width: 41.66667%; - } - .xxlarge-push-5 { - position: relative; - left: 41.66667%; - } - .xxlarge-pull-5 { - position: relative; - left: -41.66667%; - } - .xxlarge-offset-4 { - margin-left: 33.33333%; - } - .xxlarge-6 { - width: 50%; - } - .xxlarge-push-6 { - position: relative; - left: 50%; - } - .xxlarge-pull-6 { - position: relative; - left: -50%; - } - .xxlarge-offset-5 { - margin-left: 41.66667%; - } - .xxlarge-7 { - width: 58.33333%; - } - .xxlarge-push-7 { - position: relative; - left: 58.33333%; - } - .xxlarge-pull-7 { - position: relative; - left: -58.33333%; - } - .xxlarge-offset-6 { - margin-left: 50%; - } - .xxlarge-8 { - width: 66.66667%; - } - .xxlarge-push-8 { - position: relative; - left: 66.66667%; - } - .xxlarge-pull-8 { - position: relative; - left: -66.66667%; - } - .xxlarge-offset-7 { - margin-left: 58.33333%; - } - .xxlarge-9 { - width: 75%; - } - .xxlarge-push-9 { - position: relative; - left: 75%; - } - .xxlarge-pull-9 { - position: relative; - left: -75%; - } - .xxlarge-offset-8 { - margin-left: 66.66667%; - } - .xxlarge-10 { - width: 83.33333%; - } - .xxlarge-push-10 { - position: relative; - left: 83.33333%; - } - .xxlarge-pull-10 { - position: relative; - left: -83.33333%; - } - .xxlarge-offset-9 { - margin-left: 75%; - } - .xxlarge-11 { - width: 91.66667%; - } - .xxlarge-push-11 { - position: relative; - left: 91.66667%; - } - .xxlarge-pull-11 { - position: relative; - left: -91.66667%; - } - .xxlarge-offset-10 { - margin-left: 83.33333%; - } - .xxlarge-12 { - width: 100%; - } - .xxlarge-offset-11 { - margin-left: 91.66667%; - } - .xxlarge-up-1 > .column,.xxlarge-up-1 > .columns { - width: 100%; - float: left; - } - .xxlarge-up-1 > .column:nth-of-type(1n),.xxlarge-up-1 > .columns:nth-of-type(1n) { - clear: none; - } - .xxlarge-up-1 > .column:nth-of-type(1n+1),.xxlarge-up-1 > .columns:nth-of-type(1n+1) { - clear: both; - } - .xxlarge-up-1 > .column:last-child,.xxlarge-up-1 > .columns:last-child { - float: left; - } - .xxlarge-up-2 > .column,.xxlarge-up-2 > .columns { - width: 50%; - float: left; - } - .xxlarge-up-2 > .column:nth-of-type(1n),.xxlarge-up-2 > .columns:nth-of-type(1n) { - clear: none; - } - .xxlarge-up-2 > .column:nth-of-type(2n+1),.xxlarge-up-2 > .columns:nth-of-type(2n+1) { - clear: both; - } - .xxlarge-up-2 > .column:last-child,.xxlarge-up-2 > .columns:last-child { - float: left; - } - .xxlarge-up-3 > .column,.xxlarge-up-3 > .columns { - width: 33.33333%; - float: left; - } - .xxlarge-up-3 > .column:nth-of-type(1n),.xxlarge-up-3 > .columns:nth-of-type(1n) { - clear: none; - } - .xxlarge-up-3 > .column:nth-of-type(3n+1),.xxlarge-up-3 > .columns:nth-of-type(3n+1) { - clear: both; - } - .xxlarge-up-3 > .column:last-child,.xxlarge-up-3 > .columns:last-child { - float: left; - } - .xxlarge-up-4 > .column,.xxlarge-up-4 > .columns { - width: 25%; - float: left; - } - .xxlarge-up-4 > .column:nth-of-type(1n),.xxlarge-up-4 > .columns:nth-of-type(1n) { - clear: none; - } - .xxlarge-up-4 > .column:nth-of-type(4n+1),.xxlarge-up-4 > .columns:nth-of-type(4n+1) { - clear: both; - } - .xxlarge-up-4 > .column:last-child,.xxlarge-up-4 > .columns:last-child { - float: left; - } - .xxlarge-up-5 > .column,.xxlarge-up-5 > .columns { - width: 20%; - float: left; - } - .xxlarge-up-5 > .column:nth-of-type(1n),.xxlarge-up-5 > .columns:nth-of-type(1n) { - clear: none; - } - .xxlarge-up-5 > .column:nth-of-type(5n+1),.xxlarge-up-5 > .columns:nth-of-type(5n+1) { - clear: both; - } - .xxlarge-up-5 > .column:last-child,.xxlarge-up-5 > .columns:last-child { - float: left; - } - .xxlarge-up-6 > .column,.xxlarge-up-6 > .columns { - width: 16.66667%; - float: left; - } - .xxlarge-up-6 > .column:nth-of-type(1n),.xxlarge-up-6 > .columns:nth-of-type(1n) { - clear: none; - } - .xxlarge-up-6 > .column:nth-of-type(6n+1),.xxlarge-up-6 > .columns:nth-of-type(6n+1) { - clear: both; - } - .xxlarge-up-6 > .column:last-child,.xxlarge-up-6 > .columns:last-child { - float: left; - } - .xxlarge-up-7 > .column,.xxlarge-up-7 > .columns { - width: 14.28571%; - float: left; - } - .xxlarge-up-7 > .column:nth-of-type(1n),.xxlarge-up-7 > .columns:nth-of-type(1n) { - clear: none; - } - .xxlarge-up-7 > .column:nth-of-type(7n+1),.xxlarge-up-7 > .columns:nth-of-type(7n+1) { - clear: both; - } - .xxlarge-up-7 > .column:last-child,.xxlarge-up-7 > .columns:last-child { - float: left; - } - .xxlarge-up-8 > .column,.xxlarge-up-8 > .columns { - width: 12.5%; - float: left; - } - .xxlarge-up-8 > .column:nth-of-type(1n),.xxlarge-up-8 > .columns:nth-of-type(1n) { - clear: none; - } - .xxlarge-up-8 > .column:nth-of-type(8n+1),.xxlarge-up-8 > .columns:nth-of-type(8n+1) { - clear: both; - } - .xxlarge-up-8 > .column:last-child,.xxlarge-up-8 > .columns:last-child { - float: left; - } - .xxlarge-collapse > .column,.xxlarge-collapse > .columns { - padding-left: 0; - padding-right: 0; - } - .xxlarge-collapse .row { - margin-left: 0; - margin-right: 0; - } - .xxlarge-uncollapse > .column,.xxlarge-uncollapse > .columns { - padding-left: 0.9375rem; - padding-right: 0.9375rem; - } - .xxlarge-centered { - float: none; - margin-left: auto; - margin-right: auto; - } - .xxlarge-uncentered,.xxlarge-push-0,.xxlarge-pull-0 { - position: static; - margin-left: 0; - margin-right: 0; - float: left; - } -} - -div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,p,blockquote,th,td { - margin: 0; - padding: 0; -} -p { - font-size: inherit; - line-height: 1.6; - margin-bottom: 0; - text-rendering: optimizeLegibility; -} -.off-canvas-content div { - line-height: 1.6; -} -em,i { - font-style: italic; - line-height: inherit; -} -strong,b { - font-weight: bold; - line-height: inherit; -} -h1,h2,h3,h4,h5,h6 { - font-family: "Hind Siliguri", Helvetica, Roboto, Arial, sans-serif; - font-weight: 500; - font-style: normal; - color: #7cad2a; - text-rendering: optimizeLegibility; - margin-top: 0; - margin-bottom: 0.5rem; - line-height: 1.4; -} -h1 small,h2 small,h3 small,h4 small,h5 small,h6 small { - color: #cacaca; - line-height: 0; -} -h2 { - font-size: 1.25rem; -} -h3 { - font-size: 1.1875rem; -} -h4 { - font-size: 1.125rem; -} -h5 { - font-size: 1.0625rem; -} -h6 { - font-size: 1rem; -} - -a:hover,a:focus { - color: #779000; - text-decoration: underline; -} -a img { - border: 0; -} -ul,ol,dl { - line-height: 1.6; - margin-bottom: 0; - list-style-position: outside; -} -li { - font-size: inherit; -} -ul { - list-style-type: disc; - margin-left: 1.25rem; -} -ol { - margin-left: 1.25rem; -} -ul ul,ol ul,ul ol,ol ol { - margin-left: 1.25rem; - margin-bottom: 0; -} -dl { - margin-bottom: 1rem; -} -dl dt { - margin-bottom: 0.3rem; - font-weight: bold; -} -blockquote { - margin: 0 0 0; - padding: 0.5625rem 1.25rem 0 1.1875rem; - border-left: 1px solid #cacaca; -} -blockquote,blockquote p { - line-height: 1.6; - color: #414042; -} -cite { - display: block; - font-size: 0.8125rem; - color: #414042; -} -cite:before { - content: '\2014 \0020'; -} -abbr { - color: #414042; - cursor: help; - border-bottom: 1px dotted #0a0a0a; -} -code { - font-family: Consolas, "Liberation Mono", Courier, monospace; - font-weight: 300; - color: #0a0a0a; - background-color: #e6e6e6; - border: 1px solid #cacaca; - padding: 0.125rem 0.3125rem 0.0625rem; -} -kbd { - padding: 0.125rem 0.25rem 0; - margin: 0; - background-color: #e6e6e6; - color: #0a0a0a; - font-family: Consolas, "Liberation Mono", Courier, monospace; -} -.subheader { - margin-top: 0.2rem; - margin-bottom: 0.5rem; - font-weight: 300; - line-height: 1.4; - color: #414042; -} -.lead { - font-size: 125%; - line-height: 1.6; -} -.stat { - font-size: 2.5rem; - line-height: 1; -} -p + .stat { - margin-top: -1rem; -} -.no-bullet { - margin-left: 0; - list-style: none; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -.text-justify { - text-align: justify; -} - -@media screen and (min-width: 40em) { - - .medium-text-left { - text-align: left; - } - .medium-text-right { - text-align: right; - } - .medium-text-center { - text-align: center; - } - .medium-text-justify { - text-align: justify; - } -} - - -@media screen and (min-width: 64em) { - - .large-text-left { - text-align: left; - } - .large-text-right { - text-align: right; - } - .large-text-center { - text-align: center; - } - .large-text-justify { - text-align: justify; - } -} - - -@media screen and (min-width: 75em) { - - .xlarge-text-left { - text-align: left; - } - .xlarge-text-right { - text-align: right; - } - .xlarge-text-center { - text-align: center; - } - .xlarge-text-justify { - text-align: justify; - } -} - - -@media screen and (min-width: 90em) { - - .xxlarge-text-left { - text-align: left; - } - .xxlarge-text-right { - text-align: right; - } - .xxlarge-text-center { - text-align: center; - } - .xxlarge-text-justify { - text-align: justify; - } -} - -.show-for-print { - display: none !important; -} - -@media print { - - * { - background: transparent !important; - color: black !important; - box-shadow: none !important; - text-shadow: none !important; - } - .show-for-print { - display: block !important; - } - .hide-for-print { - display: none !important; - } - table.show-for-print { - display: table !important; - } - thead.show-for-print { - display: table-header-group !important; - } - tbody.show-for-print { - display: table-row-group !important; - } - tr.show-for-print { - display: table-row !important; - } - td.show-for-print { - display: table-cell !important; - } - th.show-for-print { - display: table-cell !important; - } - a,a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - .ir a:after,a[href^='javascript:']:after,a[href^='#']:after { - content: ''; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - pre,blockquote { - border: 1px solid #414042; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr,img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 0.5cm; - } - p,h2,h3 { - orphans: 3; - widows: 3; - } - h2,h3 { - page-break-after: avoid; - } -} - -.button { - display: inline-block; - text-align: center; - line-height: 1; - cursor: pointer; - -webkit-appearance: none; - transition: background-color 0.25s ease-out, color 0.25s ease-out; - vertical-align: middle; - border: 1px solid transparent; - border-radius: 7px; - padding: 0.65em 1.25em; - margin: 0 0 1rem 0; - font-size: 0.9rem; - background-color: #2bc8e8; - color: #fefefe; -} -[data-whatinput='mouse'] .button { - outline: 0; -} -.button:hover,.button:focus { - background-color: #17b3d3; - color: #fefefe; -} -.button.tiny { - font-size: 0.6rem; -} -.button.small { - font-size: 0.75rem; -} -.button.large { - font-size: 1.25rem; -} -.button.expanded { - display: block; - width: 100%; - margin-left: 0; - margin-right: 0; -} -.button.primary { - background-color: #2bc8e8; - color: #fefefe; -} -.button.primary:hover,.button.primary:focus { - background-color: #16a9c6; - color: #fefefe; -} -.button.secondary { - background-color: #777; - color: #fefefe; -} -.button.secondary:hover,.button.secondary:focus { - background-color: #5f5f5f; - color: #fefefe; -} -.button.success { - background-color: #7cad2a; - color: #fefefe; -} -.button.success:hover,.button.success:focus { - background-color: #6e8600; - color: #fefefe; -} -.button.warning { - background-color: #ffc339; - color: #0a0a0a; -} -.button.warning:hover,.button.warning:focus { - background-color: #faae00; - color: #0a0a0a; -} -.button.alert { - background-color: #ec5840; - color: #fefefe; -} -.button.alert:hover,.button.alert:focus { - background-color: #da3116; - color: #fefefe; -} -.button.hollow { - border: 1px solid #2bc8e8; - color: #2bc8e8; -} -.button.hollow,.button.hollow:hover,.button.hollow:focus { - background-color: transparent; -} -.button.hollow:hover,.button.hollow:focus { - border-color: #0d697c; - color: #0d697c; -} -.button.hollow.primary { - border: 1px solid #2bc8e8; - color: #2bc8e8; -} -.button.hollow.primary:hover,.button.hollow.primary:focus { - border-color: #0d697c; - color: #0d697c; -} -.button.hollow.secondary { - border: 1px solid #777; - color: #777; -} -.button.hollow.secondary:hover,.button.hollow.secondary:focus { - border-color: #3c3c3c; - color: #3c3c3c; -} -.button.hollow.success { - border: 1px solid #7cad2a; - color: #7cad2a; -} -.button.hollow.success:hover,.button.hollow.success:focus { - border-color: #455400; - color: #455400; -} -.button.hollow.warning { - border: 1px solid #ffc339; - color: #ffc339; -} -.button.hollow.warning:hover,.button.hollow.warning:focus { - border-color: #9c6d00; - color: #9c6d00; -} -.button.hollow.alert { - border: 1px solid #ec5840; - color: #ec5840; -} -.button.hollow.alert:hover,.button.hollow.alert:focus { - border-color: #881f0e; - color: #881f0e; -} -.button.disabled,.button[disabled] { - opacity: 0.25; - cursor: not-allowed; -} -.button.dropdown::after { - content: ''; - display: inline-block; - width: 0; - height: 0; - border: inset 0.4em; - border-color: #fefefe transparent transparent; - border-top-style: solid; - border-bottom-width: 0; - position: relative; - top: 0.4em; - float: right; - margin-left: 1.25em; -} -.button.arrow-only::after { - margin-left: 0; - float: none; - top: -0.1em; -} -[type='text'],[type='password'],[type='date'],[type='datetime'],[type='datetime-local'],[type='month'],[type='week'],[type='email'],[type='number'],[type='search'],[type='tel'],[type='time'],[type='url'],[type='color'],textarea { - display: block; - box-sizing: border-box; - width: 100%; - height: 2.4375rem; - padding: 0.5rem; - border: 1px solid #7cad2a; - margin: 0 0 1rem; - font-family: inherit; - font-size: 1rem; - color: #414042; - background-color: #fefefe; - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); - border-radius: 7px; - transition: box-shadow 0.5s, border-color 0.25s ease-in-out; - -webkit-appearance: none; - -moz-appearance: none; -} -[type='text']:focus,[type='password']:focus,[type='date']:focus,[type='datetime']:focus,[type='datetime-local']:focus,[type='month']:focus,[type='week']:focus,[type='email']:focus,[type='number']:focus,[type='search']:focus,[type='tel']:focus,[type='time']:focus,[type='url']:focus,[type='color']:focus,textarea:focus { - border: 2px solid #7cad2a; - background-color: #fefefe; - outline: none; - box-shadow: 0 0 5px #414042; - transition: box-shadow 0.5s, border-color 0.25s ease-in-out; -} -textarea[rows] { - height: auto; -} -input::-webkit-input-placeholder,textarea::-webkit-input-placeholder { - color: #9F9F9F; -} -input::-moz-placeholder,textarea::-moz-placeholder { - color: #9F9F9F; -} -input:-ms-input-placeholder,textarea:-ms-input-placeholder { - color: #9F9F9F; -} -input::placeholder,textarea::placeholder { - color: #9F9F9F; -} -input:disabled,input[readonly],textarea:disabled,textarea[readonly] { - background-color: #e6e6e6; - cursor: default; -} -[type='submit'],[type='button'] { - border-radius: 7px; - -webkit-appearance: none; - -moz-appearance: none; -} -input[type='search'] { - box-sizing: border-box; -} -[type='file'],[type='checkbox'],[type='radio'] { - margin: 0 0 1rem; -} -[type='checkbox'] + label,[type='radio'] + label { - display: inline-block; - margin-left: 0.5rem; - margin-right: 1rem; - margin-bottom: 0; - vertical-align: baseline; -} -[type='checkbox'] + label[for],[type='radio'] + label[for] { - cursor: pointer; -} -label > [type='checkbox'],label > [type='radio'] { - margin-right: 0.5rem; -} -[type='file'] { - width: 100%; -} -label { - display: block; - margin: 0; - font-size: 0.875rem; - font-weight: 300; - line-height: 1.8; - color: #0a0a0a; -} -label.middle { - margin: 0 0 1rem; - padding: 0.625rem 0; -} -.help-text { - margin-top: -0.5rem; - font-size: 0.8125rem; - font-style: italic; - color: #0a0a0a; -} -.input-group { - display: table; - width: 100%; - margin-bottom: 1rem; -} -.input-group > :first-child { - border-radius: 0 0 0 0; -} -.input-group > :last-child > * { - border-radius: 0 0 0 0; -} -.input-group-label,.input-group-field,.input-group-button { - margin: 0; - display: table-cell; - vertical-align: middle; -} -.input-group-label { - text-align: center; - padding: 0 1rem; - background: #e6e6e6; - color: #0a0a0a; - border: 1px solid #cacaca; - white-space: nowrap; - width: 1%; - height: 100%; -} -.input-group-label:first-child { - border-right: 0; -} -.input-group-label:last-child { - border-left: 0; -} -.input-group-field { - border-radius: 0; - height: 2.5rem; -} -.input-group-button { - padding-top: 0; - padding-bottom: 0; - text-align: center; - height: 100%; - width: 1%; -} -.input-group-button a,.input-group-button input,.input-group-button button { - margin: 0; -} -.input-group .input-group-button { - display: table-cell; -} -fieldset { - border: 0; - padding: 0; - margin: 0; -} -.fieldset { - border: 1px solid #cacaca; - padding: 1.25rem; - margin: 1.125rem 0; -} -.fieldset legend { - background: #fefefe; - padding: 0 0.1875rem; - margin: 0; - margin-left: -0.1875rem; -} - -@media screen and (min-width: 0\0) { - - select { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg=="); - } -} - -select:disabled { - background-color: #e6e6e6; - cursor: default; -} -select::-ms-expand { - display: none; -} -select[multiple] { - height: auto; - background-image: none; -} -.is-invalid-input:not(:focus) { - background-color: rgba(236, 88, 64, 0.1); - border-color: #ec5840; -} -.is-invalid-label { - color: #ec5840; -} -.form-error { - display: none; - margin-top: -0.5rem; - margin-bottom: 1rem; - font-size: 0.75rem; - font-weight: bold; - color: #ec5840; -} -.form-error.is-visible { - display: block; -} -.accordion { - list-style-type: none; - background: #fefefe; - border: 1px solid #e6e6e6; - border-bottom: 0; - border-radius: 0; - margin-left: 0; -} -.accordion-title { - display: block; - padding: 1.25rem 1rem; - line-height: 1; - font-size: 0.75rem; - color: #2bc8e8; - position: relative; - border-bottom: 1px solid #e6e6e6; -} -.accordion-title:hover,.accordion-title:focus { - background-color: #e6e6e6; -} -.accordion-title::before { - content: '+'; - position: absolute; - right: 1rem; - top: 50%; - margin-top: -0.5rem; -} -.is-active > .accordion-title::before { - content: '–'; -} -.accordion-content { - padding: 1rem; - display: none; - border-bottom: 1px solid #e6e6e6; - background-color: #fefefe; -} -.is-accordion-submenu-parent > a { - position: relative; -} -.is-accordion-submenu-parent > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 6px; - border-color: #2bc8e8 transparent transparent; - border-top-style: solid; - border-bottom-width: 0; - position: absolute; - top: 50%; - margin-top: -4px; - right: 1rem; -} -.is-accordion-submenu-parent[aria-expanded='true'] > a::after { - -webkit-transform-origin: 50% 50%; - -ms-transform-origin: 50% 50%; - transform-origin: 50% 50%; - -webkit-transform: scaleY(-1); - -ms-transform: scaleY(-1); - transform: scaleY(-1); -} -.badge { - display: inline-block; - padding: 0.3em; - min-width: 2.1em; - font-size: 0.6rem; - text-align: center; - border-radius: 50%; - background: #2bc8e8; - color: #fefefe; -} -.badge.secondary { - background: #777; - color: #fefefe; -} -.badge.success { - background: #7cad2a; - color: #fefefe; -} -.badge.warning { - background: #ffc339; - color: #0a0a0a; -} -.badge.alert { - background: #ec5840; - color: #fefefe; -} -.breadcrumbs { - list-style: none; - margin: 0 0 1rem 0; -} -.breadcrumbs::before,.breadcrumbs::after { - content: ' '; - display: table; -} -.breadcrumbs::after { - clear: both; -} -.breadcrumbs li { - float: left; - color: #0a0a0a; - font-size: 0.6875rem; - cursor: default; - text-transform: uppercase; -} -.breadcrumbs li:not(:last-child)::after { - color: #cacaca; - content: "/"; - margin: 0 0.75rem; - position: relative; - top: 1px; - opacity: 1; -} -.breadcrumbs a { - color: #2bc8e8; -} -.breadcrumbs a:hover { - text-decoration: underline; -} -.breadcrumbs .disabled { - color: #cacaca; - cursor: not-allowed; -} -.button-group { - margin-bottom: 1rem; - font-size: 0; -} -.button-group::before,.button-group::after { - content: ' '; - display: table; -} -.button-group::after { - clear: both; -} -.button-group .button { - margin: 0; - font-size: 0.9rem; -} -.button-group .button:not(:last-child) { - margin-right: 1px; -} -.button-group.tiny .button { - font-size: 0.6rem; -} -.button-group.small .button { - font-size: 0.75rem; -} -.button-group.large .button { - font-size: 1.25rem; -} -.button-group.expanded { - margin-right: -1px; -} -.button-group.expanded::before,.button-group.expanded::after { - display: none; -} -.button-group.expanded .button:first-child:nth-last-child(2),.button-group.expanded .button:first-child:nth-last-child(2):first-child:nth-last-child(2) ~ .button { - display: inline-block; - width: calc(50% - 1px); - margin-right: 1px; -} -.button-group.expanded .button:first-child:nth-last-child(3),.button-group.expanded .button:first-child:nth-last-child(3):first-child:nth-last-child(3) ~ .button { - display: inline-block; - width: calc(33.33333% - 1px); - margin-right: 1px; -} -.button-group.expanded .button:first-child:nth-last-child(4),.button-group.expanded .button:first-child:nth-last-child(4):first-child:nth-last-child(4) ~ .button { - display: inline-block; - width: calc(25% - 1px); - margin-right: 1px; -} -.button-group.expanded .button:first-child:nth-last-child(5),.button-group.expanded .button:first-child:nth-last-child(5):first-child:nth-last-child(5) ~ .button { - display: inline-block; - width: calc(20% - 1px); - margin-right: 1px; -} -.button-group.expanded .button:first-child:nth-last-child(6),.button-group.expanded .button:first-child:nth-last-child(6):first-child:nth-last-child(6) ~ .button { - display: inline-block; - width: calc(16.66667% - 1px); - margin-right: 1px; -} -.button-group.primary .button { - background-color: #2bc8e8; - color: #fefefe; -} -.button-group.primary .button:hover,.button-group.primary .button:focus { - background-color: #16a9c6; - color: #fefefe; -} -.button-group.secondary .button { - background-color: #777; - color: #fefefe; -} -.button-group.secondary .button:hover,.button-group.secondary .button:focus { - background-color: #5f5f5f; - color: #fefefe; -} -.button-group.success .button { - background-color: #7cad2a; - color: #fefefe; -} -.button-group.success .button:hover,.button-group.success .button:focus { - background-color: #6e8600; - color: #fefefe; -} -.button-group.warning .button { - background-color: #ffc339; - color: #0a0a0a; -} -.button-group.warning .button:hover,.button-group.warning .button:focus { - background-color: #faae00; - color: #0a0a0a; -} -.button-group.alert .button { - background-color: #ec5840; - color: #fefefe; -} -.button-group.alert .button:hover,.button-group.alert .button:focus { - background-color: #da3116; - color: #fefefe; -} -.button-group.stacked .button,.button-group.stacked-for-small .button,.button-group.stacked-for-medium .button { - width: 100%; - border-right: 1px solid transparent; -} -.button-group.stacked .button:not(:last-child),.button-group.stacked-for-small .button:not(:last-child),.button-group.stacked-for-medium .button:not(:last-child) { - border-bottom: 1px solid #fefefe; -} - -@media screen and (min-width: 40em) { - - .button-group.stacked-for-small .button { - width: auto; - } - .button-group.stacked-for-small .button:not(:last-child) { - margin-right: 1px; - } -} - - -@media screen and (min-width: 64em) { - - .button-group.stacked-for-medium .button { - width: auto; - } - .button-group.stacked-for-medium .button:not(:last-child) { - margin-right: 1px; - } -} - - -@media screen and (max-width: 39.9375em) { - - .button-group.stacked-for-small.expanded { - display: block; - } - .button-group.stacked-for-small.expanded .button { - display: block; - margin-right: 0; - } -} - -.callout { - margin: 0 0 1rem 0; - padding: 1rem; - border: 1px solid rgba(10, 10, 10, 0.25); - border-radius: 0; - position: relative; - color: #414042; - background-color: white; -} -.callout > :first-child { - margin-top: 0; -} -.callout > :last-child { - margin-bottom: 0; -} -.callout.primary { - background-color: #dff7fc; -} -.callout.secondary { - background-color: #ebebeb; -} -.callout.success { - background-color: #f6ffcc; -} -.callout.warning { - background-color: #fff6e1; -} -.callout.alert { - background-color: #fce6e2; -} -.callout.small { - padding-top: 0.5rem; - padding-right: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 0.5rem; -} -.callout.large { - padding-top: 3rem; - padding-right: 3rem; - padding-bottom: 3rem; - padding-left: 3rem; -} -.close-button { - position: absolute; - color: #414042; - right: 1rem; - top: 0.5rem; - font-size: 2em; - line-height: 1; - cursor: pointer; -} -[data-whatinput='mouse'] .close-button { - outline: 0; -} -.close-button:hover,.close-button:focus { - color: #0a0a0a; -} -.menu { - margin: 0; - list-style-type: none; -} -.menu > li { - display: table-cell; - vertical-align: middle; -} -[data-whatinput='mouse'] .menu > li { - outline: 0; -} -.menu > li > a { - display: block; - padding: 0.7rem 1rem; - line-height: 1; -} -.menu input,.menu a,.menu button { - margin-bottom: 0; -} -.menu > li > a img,.menu > li > a i { - vertical-align: middle; - margin-right: 0.25rem; - display: inline-block; -} -.menu > li > a i + span,.menu > li > a img + span { - vertical-align: middle; -} -.menu.vertical > li { - display: block; -} - -@media screen and (min-width: 40em) { - - .menu.medium-horizontal > li { - display: table-cell; - } - .menu.medium-vertical > li { - display: block; - } -} - - -@media screen and (min-width: 64em) { - - .menu.large-horizontal > li { - display: table-cell; - } - .menu.large-vertical > li { - display: block; - } -} - - -@media screen and (min-width: 75em) { - - .menu.xlarge-horizontal > li { - display: table-cell; - } - .menu.xlarge-vertical > li { - display: block; - } -} - - -@media screen and (min-width: 90em) { - - .menu.xxlarge-horizontal > li { - display: table-cell; - } - .menu.xxlarge-vertical > li { - display: block; - } -} - -.menu.simple li { - line-height: 1; - display: inline-block; - margin-right: 1rem; -} -.menu.simple a { - padding: 0; -} -.menu.align-right::before,.menu.align-right::after { - content: ' '; - display: table; -} -.menu.align-right::after { - clear: both; -} -.menu.align-right > li { - float: right; -} -.menu.expanded { - width: 100%; - display: table; - table-layout: fixed; -} -.menu.expanded > li:first-child:last-child { - width: 100%; -} -.menu.icon-top > li > a { - text-align: center; -} -.menu.icon-top > li > a img,.menu.icon-top > li > a i { - display: block; - margin: 0 auto 0.25rem; -} -.menu.nested { - margin-left: 1rem; -} -.menu .active > a { - color: #fefefe; - background: inherit; -} -.menu-text { - font-weight: bold; - color: inherit; - line-height: 1; - padding-top: 0; - padding-bottom: 0; - padding: 0.7rem 1rem; -} -.menu-centered { - text-align: center; -} -.menu-centered > .menu { - display: inline-block; -} -.no-js [data-responsive-menu] ul { - display: none; -} -.menu-icon { - position: relative; - display: inline-block; - vertical-align: middle; - cursor: pointer; - width: 20px; - height: 16px; -} -.menu-icon::after { - content: ''; - position: absolute; - display: block; - width: 100%; - height: 2px; - background: #fefefe; - top: 0; - left: 0; - box-shadow: 0 7px 0 #fefefe, 0 14px 0 #fefefe; -} -.menu-icon:hover::after { - background: #cacaca; - box-shadow: 0 7px 0 #cacaca, 0 14px 0 #cacaca; -} -.menu-icon.dark { - position: relative; - display: inline-block; - vertical-align: middle; - cursor: pointer; - width: 20px; - height: 16px; -} -.menu-icon.dark::after { - content: ''; - position: absolute; - display: block; - width: 100%; - height: 2px; - background: #0a0a0a; - top: 0; - left: 0; - box-shadow: 0 7px 0 #0a0a0a, 0 14px 0 #0a0a0a; -} -.menu-icon.dark:hover::after { - background: #414042; - box-shadow: 0 7px 0 #414042, 0 14px 0 #414042; -} -.is-drilldown { - position: relative; - overflow: hidden; -} -.is-drilldown li { - display: block !important; -} -.is-drilldown-submenu { - position: absolute; - top: 0; - left: 100%; - z-index: -1; - height: 100%; - width: 100%; - background: #fefefe; - transition: transform 0.15s linear, -webkit-transform 0.15s linear; -} -.is-drilldown-submenu.is-active { - z-index: 1; - display: block; - -webkit-transform: translateX(-100%); - -ms-transform: translateX(-100%); - transform: translateX(-100%); -} -.is-drilldown-submenu.is-closing { - -webkit-transform: translateX(100%); - -ms-transform: translateX(100%); - transform: translateX(100%); -} -.is-drilldown-submenu-parent > a { - position: relative; -} -.is-drilldown-submenu-parent > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 6px; - border-color: transparent transparent transparent #2bc8e8; - border-left-style: solid; - border-right-width: 0; - position: absolute; - top: 50%; - margin-top: -6px; - right: 1rem; -} -.js-drilldown-back > a::before { - content: ''; - display: inline-block; - width: 0; - height: 0; - border: inset 6px; - border-color: transparent #2bc8e8 transparent transparent; - border-right-style: solid; - border-left-width: 0; - vertical-align: middle; - margin-right: 0.75rem; -} -.dropdown-pane { - background-color: #fefefe; - border: 1px solid #cacaca; - border-radius: 0; - display: block; - font-size: 1rem; - padding: 1rem; - position: absolute; - visibility: hidden; - width: 300px; - z-index: 10; -} -.dropdown-pane.is-open { - visibility: visible; -} -.dropdown-pane.tiny { - width: 100px; -} -.dropdown-pane.small { - width: 200px; -} -.dropdown-pane.large { - width: 400px; -} -.dropdown.menu > li.opens-left > .is-dropdown-submenu { - left: auto; - right: 0; - top: 100%; -} -.dropdown.menu > li.opens-right > .is-dropdown-submenu { - right: auto; - left: 0; - top: 100%; -} -.dropdown.menu > li.is-dropdown-submenu-parent > a { - padding-right: 1.5rem; - position: relative; -} -.dropdown.menu > li.is-dropdown-submenu-parent > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: #7cad2a transparent transparent; - border-top-style: solid; - border-bottom-width: 0; - right: 5px; - margin-top: -2px; -} -[data-whatinput='mouse'] .dropdown.menu a { - outline: 0; -} -.no-js .dropdown.menu ul { - display: none; -} -.dropdown.menu.vertical > li .is-dropdown-submenu { - top: 0; -} -.dropdown.menu.vertical > li.opens-left .is-dropdown-submenu { - left: auto; - right: 100%; -} -.dropdown.menu.vertical > li.opens-right .is-dropdown-submenu { - right: auto; - left: 100%; -} -.dropdown.menu.vertical > li > a::after { - right: 14px; - margin-top: -3px; -} -.dropdown.menu.vertical > li.opens-left > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent #7cad2a transparent transparent; - border-right-style: solid; - border-left-width: 0; -} -.dropdown.menu.vertical > li.opens-right > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent transparent transparent #7cad2a; - border-left-style: solid; - border-right-width: 0; -} - -@media screen and (min-width: 40em) { - - .dropdown.menu.medium-horizontal > li.opens-left > .is-dropdown-submenu { - left: auto; - right: 0; - top: 100%; - } - .dropdown.menu.medium-horizontal > li.opens-right > .is-dropdown-submenu { - right: auto; - left: 0; - top: 100%; - } - .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a { - padding-right: 1.5rem; - position: relative; - } - .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: #7cad2a transparent transparent; - border-top-style: solid; - border-bottom-width: 0; - right: 5px; - margin-top: -2px; - } - .dropdown.menu.medium-vertical > li .is-dropdown-submenu { - top: 0; - } - .dropdown.menu.medium-vertical > li.opens-left .is-dropdown-submenu { - left: auto; - right: 100%; - } - .dropdown.menu.medium-vertical > li.opens-right .is-dropdown-submenu { - right: auto; - left: 100%; - } - .dropdown.menu.medium-vertical > li > a::after { - right: 14px; - margin-top: -3px; - } - .dropdown.menu.medium-vertical > li.opens-left > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent #7cad2a transparent transparent; - border-right-style: solid; - border-left-width: 0; - } - .dropdown.menu.medium-vertical > li.opens-right > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent transparent transparent #7cad2a; - border-left-style: solid; - border-right-width: 0; - } -} - - -@media screen and (min-width: 64em) { - - .dropdown.menu.large-horizontal > li.opens-left > .is-dropdown-submenu { - left: auto; - right: 0; - top: 100%; - } - .dropdown.menu.large-horizontal > li.opens-right > .is-dropdown-submenu { - right: auto; - left: 0; - top: 100%; - } - .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a { - padding-right: 1.5rem; - position: relative; - } - .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: #7cad2a transparent transparent; - border-top-style: solid; - border-bottom-width: 0; - right: 5px; - margin-top: -2px; - } - .dropdown.menu.large-vertical > li .is-dropdown-submenu { - top: 0; - } - .dropdown.menu.large-vertical > li.opens-left .is-dropdown-submenu { - left: auto; - right: 100%; - } - .dropdown.menu.large-vertical > li.opens-right .is-dropdown-submenu { - right: auto; - left: 100%; - } - .dropdown.menu.large-vertical > li > a::after { - right: 14px; - margin-top: -3px; - } - .dropdown.menu.large-vertical > li.opens-left > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent #7cad2a transparent transparent; - border-right-style: solid; - border-left-width: 0; - } - .dropdown.menu.large-vertical > li.opens-right > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent transparent transparent #7cad2a; - border-left-style: solid; - border-right-width: 0; - } -} - - -@media screen and (min-width: 75em) { - - .dropdown.menu.xlarge-horizontal > li.opens-left > .is-dropdown-submenu { - left: auto; - right: 0; - top: 100%; - } - .dropdown.menu.xlarge-horizontal > li.opens-right > .is-dropdown-submenu { - right: auto; - left: 0; - top: 100%; - } - .dropdown.menu.xlarge-horizontal > li.is-dropdown-submenu-parent > a { - padding-right: 1.5rem; - position: relative; - } - .dropdown.menu.xlarge-horizontal > li.is-dropdown-submenu-parent > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: #7cad2a transparent transparent; - border-top-style: solid; - border-bottom-width: 0; - right: 5px; - margin-top: -2px; - } - .dropdown.menu.xlarge-vertical > li .is-dropdown-submenu { - top: 0; - } - .dropdown.menu.xlarge-vertical > li.opens-left .is-dropdown-submenu { - left: auto; - right: 100%; - } - .dropdown.menu.xlarge-vertical > li.opens-right .is-dropdown-submenu { - right: auto; - left: 100%; - } - .dropdown.menu.xlarge-vertical > li > a::after { - right: 14px; - margin-top: -3px; - } - .dropdown.menu.xlarge-vertical > li.opens-left > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent #7cad2a transparent transparent; - border-right-style: solid; - border-left-width: 0; - } - .dropdown.menu.xlarge-vertical > li.opens-right > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent transparent transparent #7cad2a; - border-left-style: solid; - border-right-width: 0; - } -} - - -@media screen and (min-width: 90em) { - - .dropdown.menu.xxlarge-horizontal > li.opens-left > .is-dropdown-submenu { - left: auto; - right: 0; - top: 100%; - } - .dropdown.menu.xxlarge-horizontal > li.opens-right > .is-dropdown-submenu { - right: auto; - left: 0; - top: 100%; - } - .dropdown.menu.xxlarge-horizontal > li.is-dropdown-submenu-parent > a { - padding-right: 1.5rem; - position: relative; - } - .dropdown.menu.xxlarge-horizontal > li.is-dropdown-submenu-parent > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: #7cad2a transparent transparent; - border-top-style: solid; - border-bottom-width: 0; - right: 5px; - margin-top: -2px; - } - .dropdown.menu.xxlarge-vertical > li .is-dropdown-submenu { - top: 0; - } - .dropdown.menu.xxlarge-vertical > li.opens-left .is-dropdown-submenu { - left: auto; - right: 100%; - } - .dropdown.menu.xxlarge-vertical > li.opens-right .is-dropdown-submenu { - right: auto; - left: 100%; - } - .dropdown.menu.xxlarge-vertical > li > a::after { - right: 14px; - margin-top: -3px; - } - .dropdown.menu.xxlarge-vertical > li.opens-left > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent #7cad2a transparent transparent; - border-right-style: solid; - border-left-width: 0; - } - .dropdown.menu.xxlarge-vertical > li.opens-right > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent transparent transparent #7cad2a; - border-left-style: solid; - border-right-width: 0; - } -} - -.dropdown.menu.align-right .is-dropdown-submenu.first-sub { - top: 100%; - left: auto; - right: 0; -} -.is-dropdown-menu.vertical { - width: 100px; -} -.is-dropdown-menu.vertical.align-right { - float: right; -} -.is-dropdown-submenu-parent { - position: relative; -} -.is-dropdown-submenu-parent a::after { - position: absolute; - top: 50%; - right: 5px; - margin-top: -2px; -} -.is-dropdown-submenu-parent.opens-inner .is-dropdown-submenu { - top: 100%; -} -.is-dropdown-submenu-parent.opens-left .is-dropdown-submenu { - left: auto; - right: 100%; -} -.is-dropdown-submenu { - display: none; - position: absolute; - top: 0; - left: 100%; - min-width: 200px; - z-index: 1; - background: #fefefe; - border: 1px solid #cacaca; -} -.is-dropdown-submenu .is-dropdown-submenu-parent > a::after { - right: 14px; - margin-top: -3px; -} -.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent #7cad2a transparent transparent; - border-right-style: solid; - border-left-width: 0; -} -.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent transparent transparent #7cad2a; - border-left-style: solid; - border-right-width: 0; -} -.is-dropdown-submenu .is-dropdown-submenu { - margin-top: -1px; -} -.is-dropdown-submenu > li { - width: 100%; -} -.is-dropdown-submenu:not(.js-dropdown-nohover) > .is-dropdown-submenu-parent:hover > .is-dropdown-submenu,.is-dropdown-submenu.js-dropdown-active { - display: block; -} -.flex-video { - position: relative; - height: 0; - padding-bottom: 75%; - margin-bottom: 1rem; - overflow: hidden; -} -.flex-video iframe,.flex-video object,.flex-video embed,.flex-video video { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; -} -.flex-video.widescreen { - padding-bottom: 56.25%; -} -.flex-video.vimeo { - padding-top: 0; -} -.label { - display: inline-block; - padding: 0.33333rem 0.5rem; - font-size: 0.8rem; - line-height: 1; - white-space: nowrap; - cursor: default; - border-radius: 0; - background: #2bc8e8; - color: #fefefe; -} -.label.secondary { - background: #777; - color: #fefefe; -} -.label.success { - background: #7cad2a; - color: #fefefe; -} -.label.warning { - background: #ffc339; - color: #0a0a0a; -} -.label.alert { - background: #ec5840; - color: #fefefe; -} -.media-object { - margin-bottom: 1rem; - display: block; -} -.media-object img { - max-width: none; -} - -@media screen and (max-width: 39.9375em) { - - .media-object.stack-for-small .media-object-section { - padding: 0; - padding-bottom: 1rem; - display: block; - } - .media-object.stack-for-small .media-object-section img { - width: 100%; - } -} - -.media-object-section { - display: table-cell; - vertical-align: top; -} -.media-object-section:first-child { - padding-right: 1rem; -} -.media-object-section:last-child:not(:nth-child(2)) { - padding-left: 1rem; -} -.media-object-section.middle { - vertical-align: middle; -} -.media-object-section.bottom { - vertical-align: bottom; -} -html,body { - height: 100%; -} -.off-canvas-wrapper { - width: 100%; - overflow-x: hidden; - position: relative; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-overflow-scrolling: auto; - overflow: hidden; -} -.off-canvas-wrapper-inner { - position: relative; - width: 100%; - transition: transform 0.5s ease, -webkit-transform 0.5s ease; -} -.off-canvas-wrapper-inner::before,.off-canvas-wrapper-inner::after { - content: ' '; - display: table; -} -.off-canvas-wrapper-inner::after { - clear: both; -} -.off-canvas-content,.off-canvas-content { - min-height: 100%; - background: #fefefe; - transition: transform 0.5s ease, -webkit-transform 0.5s ease; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - z-index: 1; - padding-bottom: 0.1px; - box-shadow: 0 0 10px rgba(10, 10, 10, 0.5); -} -.js-off-canvas-exit { - display: none; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(254, 254, 254, 0.25); - cursor: pointer; - transition: background 0.5s ease; -} -.off-canvas { - position: fixed; - background: #7cad2a; - z-index: 50; - max-height: 100%; - overflow-y: auto; - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - min-height: 100%; -} -[data-whatinput='mouse'] .off-canvas { - outline: 0; -} -.off-canvas.position-left { - left: -250px; - top: 0; - width: 250px; -} -.is-open-left { - -webkit-transform: translateX(250px); - -ms-transform: translateX(250px); - transform: translateX(250px); -} -.off-canvas.position-right { - right: -250px; - top: 0; - width: 250px; -} -.is-open-right { - -webkit-transform: translateX(-250px); - -ms-transform: translateX(-250px); - transform: translateX(-250px); -} - -@media screen and (min-width: 40em) { - - .position-left.reveal-for-medium { - left: 0; - z-index: auto; - position: fixed; - } - .position-left.reveal-for-medium ~ .off-canvas-content { - margin-left: 250px; - } - .position-right.reveal-for-medium { - right: 0; - z-index: auto; - position: fixed; - } - .position-right.reveal-for-medium ~ .off-canvas-content { - margin-right: 250px; - } -} - - -@media screen and (min-width: 64em) { - - .position-left.reveal-for-large { - left: 0; - z-index: auto; - position: fixed; - } - .position-left.reveal-for-large ~ .off-canvas-content { - margin-left: 250px; - } - .position-right.reveal-for-large { - right: 0; - z-index: auto; - position: fixed; - } - .position-right.reveal-for-large ~ .off-canvas-content { - margin-right: 250px; - } -} - - -@media screen and (min-width: 75em) { - - .position-left.reveal-for-xlarge { - left: 0; - z-index: auto; - position: fixed; - } - .position-left.reveal-for-xlarge ~ .off-canvas-content { - margin-left: 250px; - } - .position-right.reveal-for-xlarge { - right: 0; - z-index: auto; - position: fixed; - } - .position-right.reveal-for-xlarge ~ .off-canvas-content { - margin-right: 250px; - } -} - - -@media screen and (min-width: 90em) { - - .position-left.reveal-for-xxlarge { - left: 0; - z-index: auto; - position: fixed; - } - .position-left.reveal-for-xxlarge ~ .off-canvas-content { - margin-left: 250px; - } - .position-right.reveal-for-xxlarge { - right: 0; - z-index: auto; - position: fixed; - } - .position-right.reveal-for-xxlarge ~ .off-canvas-content { - margin-right: 250px; - } -} - -.orbit { - position: relative; -} -.orbit-container { - position: relative; - margin: 0; - overflow: hidden; - list-style: none; -} -.orbit-slide { - width: 100%; - max-height: 100%; -} -.orbit-slide.no-motionui.is-active { - top: 0; - left: 0; -} -.orbit-figure { - margin: 0; -} -.orbit-image { - margin: 0; - width: 100%; - max-width: 100%; -} -.orbit-caption { - position: absolute; - bottom: 0; - width: 100%; - padding: 1rem; - margin-bottom: 0; - color: #fefefe; - background-color: rgba(10, 10, 10, 0.5); -} -.orbit-previous,.orbit-next { - position: absolute; - top: 50%; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - transform: translateY(-50%); - z-index: 10; - padding: 1rem; - color: #fefefe; -} -[data-whatinput='mouse'] .orbit-previous,[data-whatinput='mouse'] .orbit-next { - outline: 0; -} -.orbit-previous:hover,.orbit-next:hover,.orbit-previous:active,.orbit-next:active,.orbit-previous:focus,.orbit-next:focus { - background-color: rgba(10, 10, 10, 0.5); -} -.orbit-previous { - left: 0; -} -.orbit-next { - left: auto; - right: 0; -} -.orbit-bullets { - position: relative; - margin-top: 0.8rem; - margin-bottom: 0.8rem; - text-align: center; -} -[data-whatinput='mouse'] .orbit-bullets { - outline: 0; -} -.orbit-bullets button { - width: 1.2rem; - height: 1.2rem; - margin: 0.1rem; - background-color: #cacaca; - border-radius: 50%; -} -.orbit-bullets button:hover { - background-color: #414042; -} -.orbit-bullets button.is-active { - background-color: #414042; -} -.pagination { - margin-left: 0; - margin-bottom: 1rem; -} -.pagination::before,.pagination::after { - content: ' '; - display: table; -} -.pagination::after { - clear: both; -} -.pagination li { - font-size: 0.875rem; - margin-right: 0.0625rem; - border-radius: 0; - display: none; -} -.pagination li:last-child,.pagination li:first-child { - display: inline-block; -} - -@media screen and (min-width: 40em) { - - .pagination li { - display: inline-block; - } -} - -.pagination a,.pagination button { - color: #0a0a0a; - display: block; - padding: 0.1875rem 0.625rem; - border-radius: 0; -} -.pagination a:hover,.pagination button:hover { - background: #e6e6e6; -} -.pagination .current { - padding: 0.1875rem 0.625rem; - background: #2bc8e8; - color: #fefefe; - cursor: default; -} -.pagination .disabled { - padding: 0.1875rem 0.625rem; - color: #cacaca; - cursor: not-allowed; -} -.pagination .disabled:hover { - background: transparent; -} -.pagination .ellipsis::after { - content: '\2026'; - padding: 0.1875rem 0.625rem; - color: #0a0a0a; -} -.pagination-previous a::before,.pagination-previous.disabled::before { - content: '\00ab'; - display: inline-block; - margin-right: 0.5rem; -} -.pagination-next a::after,.pagination-next.disabled::after { - content: '\00bb'; - display: inline-block; - margin-left: 0.5rem; -} -.progress { - background-color: #cacaca; - height: 1rem; - margin-bottom: 1rem; - border-radius: 0; -} -.progress.primary .progress-meter { - background-color: #2bc8e8; -} -.progress.secondary .progress-meter { - background-color: #777; -} -.progress.success .progress-meter { - background-color: #7cad2a; -} -.progress.warning .progress-meter { - background-color: #ffc339; -} -.progress.alert .progress-meter { - background-color: #ec5840; -} -.progress-meter { - position: relative; - display: block; - width: 0%; - height: 100%; - background-color: #2bc8e8; -} -.progress-meter-text { - position: absolute; - top: 50%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - -ms-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - margin: 0; - font-size: 0.75rem; - font-weight: bold; - color: #fefefe; - white-space: nowrap; -} -.slider { - position: relative; - height: 0.5rem; - margin-top: 1.25rem; - margin-bottom: 2.25rem; - background-color: #e6e6e6; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - -ms-touch-action: none; - touch-action: none; -} -.slider-fill { - position: absolute; - top: 0; - left: 0; - display: inline-block; - max-width: 100%; - height: 0.5rem; - background-color: #cacaca; - transition: all 0.2s ease-in-out; -} -.slider-fill.is-dragging { - transition: all 0s linear; -} -.slider-handle { - position: absolute; - top: 50%; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - transform: translateY(-50%); - left: 0; - z-index: 1; - display: inline-block; - width: 1.4rem; - height: 1.4rem; - background-color: #2bc8e8; - transition: all 0.2s ease-in-out; - -ms-touch-action: manipulation; - touch-action: manipulation; - border-radius: 0; -} -[data-whatinput='mouse'] .slider-handle { - outline: 0; -} -.slider-handle:hover { - background-color: #17b3d3; -} -.slider-handle.is-dragging { - transition: all 0s linear; -} -.slider.disabled,.slider[disabled] { - opacity: 0.25; - cursor: not-allowed; -} -.slider.vertical { - display: inline-block; - width: 0.5rem; - height: 12.5rem; - margin: 0 1.25rem; - -webkit-transform: scale(1, -1); - -ms-transform: scale(1, -1); - transform: scale(1, -1); -} -.slider.vertical .slider-fill { - top: 0; - width: 0.5rem; - max-height: 100%; -} -.slider.vertical .slider-handle { - position: absolute; - top: 0; - left: 50%; - width: 1.4rem; - height: 1.4rem; - -webkit-transform: translateX(-50%); - -ms-transform: translateX(-50%); - transform: translateX(-50%); -} -.sticky-container { - position: relative; -} -.sticky { - position: absolute; - z-index: 0; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -.sticky.is-stuck { - position: fixed; - z-index: 5; -} -.sticky.is-stuck.is-at-top { - top: 0; -} -.sticky.is-stuck.is-at-bottom { - bottom: 0; -} -.sticky.is-anchored { - position: absolute; - left: auto; - right: auto; -} -.sticky.is-anchored.is-at-bottom { - bottom: 0; -} -body.is-reveal-open { - overflow: hidden; -} -.reveal-overlay { - display: none; - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - z-index: 1005; - background-color: rgba(10, 10, 10, 0.45); - overflow-y: scroll; -} -.reveal { - display: none; - z-index: 1006; - padding: 1rem; - border: 1px solid #cacaca; - background-color: #fefefe; - border-radius: 0; - position: relative; - top: 100px; - margin-left: auto; - margin-right: auto; - overflow-y: auto; -} -[data-whatinput='mouse'] .reveal { - outline: 0; -} - -@media screen and (min-width: 40em) { - - .reveal { - min-height: 0; - } -} - -.reveal .column,.reveal .columns,.reveal .columns { - min-width: 0; -} -.reveal > :last-child { - margin-bottom: 0; -} - -@media screen and (min-width: 40em) { - - .reveal { - width: 600px; - max-width: 75rem; - } -} - - -@media screen and (min-width: 40em) { - - .reveal .reveal { - left: auto; - right: auto; - margin: 0 auto; - } -} - -.reveal.collapse { - padding: 0; -} - -@media screen and (min-width: 40em) { - - .reveal.tiny { - width: 30%; - max-width: 75rem; - } -} - - -@media screen and (min-width: 40em) { - - .reveal.small { - width: 50%; - max-width: 75rem; - } -} - - -@media screen and (min-width: 40em) { - - .reveal.large { - width: 90%; - max-width: 75rem; - } -} - -.reveal.full { - top: 0; - left: 0; - width: 100%; - height: 100vh; - min-height: 100vh; - max-width: none; - margin-left: 0; - border: 0; - border-radius: 0; -} - -@media screen and (max-width: 39.9375em) { - - .reveal { - top: 0; - left: 0; - width: 100%; - height: 100%; - height: 100vh; - min-height: 100vh; - max-width: none; - margin-left: 0; - border: 0; - border-radius: 0; - } -} - -.reveal.without-overlay { - position: fixed; -} -.switch { - margin-bottom: 1rem; - outline: 0; - position: relative; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - color: #fefefe; - font-weight: bold; - font-size: 0.875rem; -} -.switch-input { - opacity: 0; - position: absolute; -} -.switch-paddle { - background: #cacaca; - cursor: pointer; - display: block; - position: relative; - width: 4rem; - height: 2rem; - transition: all 0.25s ease-out; - border-radius: 0; - color: inherit; - font-weight: inherit; -} -input + .switch-paddle { - margin: 0; -} -.switch-paddle::after { - background: #fefefe; - content: ''; - display: block; - position: absolute; - height: 1.5rem; - left: 0.25rem; - top: 0.25rem; - width: 1.5rem; - transition: all 0.25s ease-out; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - border-radius: 0; -} -input:checked ~ .switch-paddle { - background: #2bc8e8; -} -input:checked ~ .switch-paddle::after { - left: 2.25rem; -} -[data-whatinput='mouse'] input:focus ~ .switch-paddle { - outline: 0; -} -.switch-active,.switch-inactive { - position: absolute; - top: 50%; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - transform: translateY(-50%); -} -.switch-active { - left: 8%; - display: none; -} -input:checked + label > .switch-active { - display: block; -} -.switch-inactive { - right: 15%; -} -input:checked + label > .switch-inactive { - display: none; -} -.switch.tiny .switch-paddle { - width: 3rem; - height: 1.5rem; - font-size: 0.625rem; -} -.switch.tiny .switch-paddle::after { - width: 1rem; - height: 1rem; -} -.switch.tiny input:checked ~ .switch-paddle::after { - left: 1.75rem; -} -.switch.small .switch-paddle { - width: 3.5rem; - height: 1.75rem; - font-size: 0.75rem; -} -.switch.small .switch-paddle::after { - width: 1.25rem; - height: 1.25rem; -} -.switch.small input:checked ~ .switch-paddle::after { - left: 2rem; -} -.switch.large .switch-paddle { - width: 5rem; - height: 2.5rem; - font-size: 1rem; -} -.switch.large .switch-paddle::after { - width: 2rem; - height: 2rem; -} -.switch.large input:checked ~ .switch-paddle::after { - left: 2.75rem; -} -table thead,table tbody,table tfoot { - border: 1px solid #f1f1f1; - background-color: #fefefe; -} -table caption { - font-weight: bold; - padding: 0.5rem 0.625rem 0.625rem; -} -table thead,table tfoot { - background: #f8f8f8; - color: #414042; -} -table thead tr,table tfoot tr { - background: transparent; -} -table thead th,table thead td,table tfoot th,table tfoot td { - padding: 0.5rem 0.625rem 0.625rem; - font-weight: bold; - text-align: left; -} -table tbody tr:nth-child(even) { - background-color: #f1f1f1; -} -table tbody th,table tbody td { - padding: 0.5rem 0.625rem 0.625rem; -} - -@media screen and (max-width: 63.9375em) { - - table.stack thead { - display: none; - } - table.stack tfoot { - display: none; - } - table.stack tr,table.stack th,table.stack td { - display: block; - } - table.stack td { - border-top: 0; - } -} - -table.scroll { - display: block; - width: 100%; - overflow-x: auto; -} -table.hover tr:hover { - background-color: #f9f9f9; -} -table.hover tr:nth-of-type(even):hover { - background-color: #ececec; -} -.table-scroll { - overflow-x: auto; -} -.table-scroll table { - width: auto; -} -.tabs { - margin: 0; - list-style-type: none; - background: #fefefe; - border: 1px solid #e6e6e6; -} -.tabs::before,.tabs::after { - content: ' '; - display: table; -} -.tabs::after { - clear: both; -} -.tabs.vertical > li { - width: auto; - float: none; - display: block; -} -.tabs.simple > li > a { - padding: 0; -} -.tabs.simple > li > a:hover { - background: transparent; -} -.tabs.primary { - background: #2bc8e8; -} -.tabs.primary > li > a { - color: #fefefe; -} -.tabs.primary > li > a:hover,.tabs.primary > li > a:focus { - background: #1fc5e7; -} -.tabs-title { - float: left; -} -.tabs-title > a { - display: block; - padding: 1.25rem 1.5rem; - line-height: 1; - font-size: 0.75rem; -} -.tabs-title > a:hover { - background: #fefefe; -} -.tabs-title > a:focus,.tabs-title > a[aria-selected='true'] { - background: #e6e6e6; -} -.tabs-content { - background: #fefefe; - transition: all 0.5s ease; - border: 1px solid #e6e6e6; - border-top: 0; -} -.tabs-content.vertical { - border: 1px solid #e6e6e6; - border-left: 0; -} -.tabs-panel { - display: none; - padding: 1rem; -} -.tabs-panel.is-active { - display: block; -} -.thumbnail { - border: solid 7px #e6e6e6; - box-shadow: 0 0 0 1px rgba(10, 10, 10, 0.2); - display: inline-block; - line-height: 0; - max-width: 100%; - transition: box-shadow 200ms ease-out; - border-radius: 7px; - margin-bottom: 1rem; -} -.thumbnail:hover,.thumbnail:focus { - box-shadow: 0 0 6px 1px rgba(138, 168, 0, 0.8); -} -.title-bar { - background: #0a0a0a; - color: #fefefe; - padding: 0.5rem; - background-color: #7cad2a; - margin-bottom: 25px; - width: 100%; - z-index: 1000; -} -.title-bar::before,.title-bar::after { - content: ' '; - display: table; -} -.title-bar::after { - clear: both; -} -.title-bar .menu-icon { - margin-left: 0.25rem; - margin-right: 0.5rem; -} -.title-bar-left { - float: left; -} -.title-bar-right { - float: right; - text-align: right; -} -.title-bar-title { - font-weight: bold; - vertical-align: middle; - display: inline-block; -} -.has-tip { - border-bottom: dotted 1px #414042; - font-weight: bold; - position: relative; - display: inline-block; - cursor: help; -} -.tooltip { - background-color: #0a0a0a; - color: #fefefe; - font-size: 80%; - padding: 0.75rem; - position: absolute; - z-index: 10; - top: calc(100% + 0.6495rem); - max-width: 10rem !important; - border-radius: 0; -} -.tooltip::before { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 0.75rem; - border-color: transparent transparent #0a0a0a; - border-bottom-style: solid; - border-top-width: 0; - bottom: 100%; - position: absolute; - left: 50%; - -webkit-transform: translateX(-50%); - -ms-transform: translateX(-50%); - transform: translateX(-50%); -} -.tooltip.top::before { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 0.75rem; - border-color: #0a0a0a transparent transparent; - border-top-style: solid; - border-bottom-width: 0; - top: 100%; - bottom: auto; -} -.tooltip.left::before { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 0.75rem; - border-color: transparent transparent transparent #0a0a0a; - border-left-style: solid; - border-right-width: 0; - bottom: auto; - left: 100%; - top: 50%; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - transform: translateY(-50%); -} -.tooltip.right::before { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 0.75rem; - border-color: transparent #0a0a0a transparent transparent; - border-right-style: solid; - border-left-width: 0; - bottom: auto; - left: auto; - right: 100%; - top: 50%; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - transform: translateY(-50%); -} -.top-bar { - padding: 0.5rem; -} -.top-bar::before,.top-bar::after { - content: ' '; - display: table; -} -.top-bar::after { - clear: both; -} -.top-bar,.top-bar ul { - background-color: #e6e6e6; -} -.top-bar input { - max-width: 200px; - margin-right: 1rem; -} -.top-bar .input-group-field { - width: 100%; - margin-right: 0; -} -.top-bar input.button { - width: auto; -} -.top-bar .top-bar-left,.top-bar .top-bar-right { - width: 100%; -} - -@media screen and (min-width: 40em) { - - .top-bar .top-bar-left,.top-bar .top-bar-right { - width: auto; - } -} - - -@media screen and (max-width: 63.9375em) { - - .top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right { - width: 100%; - } -} - - -@media screen and (max-width: 74.9375em) { - - .top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right { - width: 100%; - } -} - - -@media screen and (max-width: 89.9375em) { - - .top-bar.stacked-for-xlarge .top-bar-left,.top-bar.stacked-for-xlarge .top-bar-right { - width: 100%; - } -} - -.top-bar.stacked-for-xxlarge .top-bar-left,.top-bar.stacked-for-xxlarge .top-bar-right { - width: 100%; -} -.top-bar-title { - float: left; - margin-right: 1rem; -} -.top-bar-left { - float: left; -} -.top-bar-right { - float: right; -} -.hide { - display: none !important; -} -.invisible { - visibility: hidden; -} - -@media screen and (max-width: 39.9375em) { - - .hide-for-small-only { - display: none !important; - } -} - - -@media screen and (max-width: 0em), screen and (min-width: 40em) { - - .show-for-small-only { - display: none !important; - } -} - - -@media screen and (min-width: 40em) { - - .hide-for-medium { - display: none !important; - } -} - - -@media screen and (max-width: 39.9375em) { - - .show-for-medium { - display: none !important; - } -} - - -@media screen and (min-width: 40em) and (max-width: 63.9375em) { - - .hide-for-medium-only { - display: none !important; - } -} - - -@media screen and (max-width: 39.9375em), screen and (min-width: 64em) { - - .show-for-medium-only { - display: none !important; - } -} - - -@media screen and (min-width: 64em) { - - .hide-for-large { - display: none !important; - } -} - - -@media screen and (max-width: 63.9375em) { - - .show-for-large { - display: none !important; - } -} - - -@media screen and (min-width: 64em) and (max-width: 74.9375em) { - - .hide-for-large-only { - display: none !important; - } -} - - -@media screen and (max-width: 63.9375em), screen and (min-width: 75em) { - - .show-for-large-only { - display: none !important; - } -} - - -@media screen and (min-width: 75em) { - - .hide-for-xlarge { - display: none !important; - } -} - - -@media screen and (max-width: 74.9375em) { - - .show-for-xlarge { - display: none !important; - } -} - - -@media screen and (min-width: 75em) and (max-width: 89.9375em) { - - .hide-for-xlarge-only { - display: none !important; - } -} - - -@media screen and (max-width: 74.9375em), screen and (min-width: 90em) { - - .show-for-xlarge-only { - display: none !important; - } -} - - -@media screen and (min-width: 90em) { - - .hide-for-xxlarge { - display: none !important; - } -} - - -@media screen and (max-width: 89.9375em) { - - .show-for-xxlarge { - display: none !important; - } -} - - -@media screen and (min-width: 90em) { - - .hide-for-xxlarge-only { - display: none !important; - } -} - - -@media screen and (max-width: 89.9375em) { - - .show-for-xxlarge-only { - display: none !important; - } -} - -.show-for-sr,.show-on-focus { - position: absolute !important; - width: 1px; - height: 1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); -} -.show-on-focus:active,.show-on-focus:focus { - position: static !important; - height: auto; - width: auto; - overflow: visible; - clip: auto; -} -.show-for-landscape,.hide-for-portrait { - display: block !important; -} - -@media screen and (orientation: landscape) { - - .show-for-landscape,.hide-for-portrait { - display: block !important; - } -} - - -@media screen and (orientation: portrait) { - - .show-for-landscape,.hide-for-portrait { - display: none !important; - } -} - -.hide-for-landscape,.show-for-portrait { - display: none !important; -} - -@media screen and (orientation: landscape) { - - .hide-for-landscape,.show-for-portrait { - display: none !important; - } -} - - -@media screen and (orientation: portrait) { - - .hide-for-landscape,.show-for-portrait { - display: block !important; - } -} - -.float-left { - float: left !important; -} -.float-right { - float: right !important; -} -.float-center { - display: block; - margin-left: auto; - margin-right: auto; -} -.clearfix::before,.clearfix::after { - content: ' '; - display: table; -} -.clearfix::after { - clear: both; -} -.slide-in-down.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: translateY(-100%); - -ms-transform: translateY(-100%); - transform: translateY(-100%); - transition-property: transform, opacity, -webkit-transform; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; -} -.slide-in-down.mui-enter.mui-enter-active { - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); -} -.slide-in-left.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: translateX(-100%); - -ms-transform: translateX(-100%); - transform: translateX(-100%); - transition-property: transform, opacity, -webkit-transform; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; -} -.slide-in-left.mui-enter.mui-enter-active { - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); -} -.slide-in-up.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: translateY(100%); - -ms-transform: translateY(100%); - transform: translateY(100%); - transition-property: transform, opacity, -webkit-transform; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; -} -.slide-in-up.mui-enter.mui-enter-active { - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); -} -.slide-in-right.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: translateX(100%); - -ms-transform: translateX(100%); - transform: translateX(100%); - transition-property: transform, opacity, -webkit-transform; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; -} -.slide-in-right.mui-enter.mui-enter-active { - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); -} -.slide-out-down.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); - transition-property: transform, opacity, -webkit-transform; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; -} -.slide-out-down.mui-leave.mui-leave-active { - -webkit-transform: translateY(100%); - -ms-transform: translateY(100%); - transform: translateY(100%); -} -.slide-out-right.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - transition-property: transform, opacity, -webkit-transform; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; -} -.slide-out-right.mui-leave.mui-leave-active { - -webkit-transform: translateX(100%); - -ms-transform: translateX(100%); - transform: translateX(100%); -} -.slide-out-up.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); - transition-property: transform, opacity, -webkit-transform; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; -} -.slide-out-up.mui-leave.mui-leave-active { - -webkit-transform: translateY(-100%); - -ms-transform: translateY(-100%); - transform: translateY(-100%); -} -.slide-out-left.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - transition-property: transform, opacity, -webkit-transform; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; -} -.slide-out-left.mui-leave.mui-leave-active { - -webkit-transform: translateX(-100%); - -ms-transform: translateX(-100%); - transform: translateX(-100%); -} -.fade-in.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - opacity: 0; - transition-property: opacity; -} -.fade-in.mui-enter.mui-enter-active { - opacity: 1; -} -.fade-out.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - opacity: 1; - transition-property: opacity; -} -.fade-out.mui-leave.mui-leave-active { - opacity: 0; -} -.hinge-in-from-top.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: perspective(2000px) rotateX(-90deg); - transform: perspective(2000px) rotateX(-90deg); - -webkit-transform-origin: top; - -ms-transform-origin: top; - transform-origin: top; - transition-property: transform, opacity, -webkit-transform; - opacity: 0; -} -.hinge-in-from-top.mui-enter.mui-enter-active { - -webkit-transform: perspective(2000px) rotate(0deg); - transform: perspective(2000px) rotate(0deg); - opacity: 1; -} -.hinge-in-from-right.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: perspective(2000px) rotateY(-90deg); - transform: perspective(2000px) rotateY(-90deg); - -webkit-transform-origin: right; - -ms-transform-origin: right; - transform-origin: right; - transition-property: transform, opacity, -webkit-transform; - opacity: 0; -} -.hinge-in-from-right.mui-enter.mui-enter-active { - -webkit-transform: perspective(2000px) rotate(0deg); - transform: perspective(2000px) rotate(0deg); - opacity: 1; -} -.hinge-in-from-bottom.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: perspective(2000px) rotateX(90deg); - transform: perspective(2000px) rotateX(90deg); - -webkit-transform-origin: bottom; - -ms-transform-origin: bottom; - transform-origin: bottom; - transition-property: transform, opacity, -webkit-transform; - opacity: 0; -} -.hinge-in-from-bottom.mui-enter.mui-enter-active { - -webkit-transform: perspective(2000px) rotate(0deg); - transform: perspective(2000px) rotate(0deg); - opacity: 1; -} -.hinge-in-from-left.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: perspective(2000px) rotateY(90deg); - transform: perspective(2000px) rotateY(90deg); - -webkit-transform-origin: left; - -ms-transform-origin: left; - transform-origin: left; - transition-property: transform, opacity, -webkit-transform; - opacity: 0; -} -.hinge-in-from-left.mui-enter.mui-enter-active { - -webkit-transform: perspective(2000px) rotate(0deg); - transform: perspective(2000px) rotate(0deg); - opacity: 1; -} -.hinge-in-from-middle-x.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: perspective(2000px) rotateX(-90deg); - transform: perspective(2000px) rotateX(-90deg); - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; - transition-property: transform, opacity, -webkit-transform; - opacity: 0; -} -.hinge-in-from-middle-x.mui-enter.mui-enter-active { - -webkit-transform: perspective(2000px) rotate(0deg); - transform: perspective(2000px) rotate(0deg); - opacity: 1; -} -.hinge-in-from-middle-y.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: perspective(2000px) rotateY(-90deg); - transform: perspective(2000px) rotateY(-90deg); - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; - transition-property: transform, opacity, -webkit-transform; - opacity: 0; -} -.hinge-in-from-middle-y.mui-enter.mui-enter-active { - -webkit-transform: perspective(2000px) rotate(0deg); - transform: perspective(2000px) rotate(0deg); - opacity: 1; -} -.hinge-out-from-top.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: perspective(2000px) rotate(0deg); - transform: perspective(2000px) rotate(0deg); - -webkit-transform-origin: top; - -ms-transform-origin: top; - transform-origin: top; - transition-property: transform, opacity, -webkit-transform; - opacity: 1; -} -.hinge-out-from-top.mui-leave.mui-leave-active { - -webkit-transform: perspective(2000px) rotateX(-90deg); - transform: perspective(2000px) rotateX(-90deg); - opacity: 0; -} -.hinge-out-from-right.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: perspective(2000px) rotate(0deg); - transform: perspective(2000px) rotate(0deg); - -webkit-transform-origin: right; - -ms-transform-origin: right; - transform-origin: right; - transition-property: transform, opacity, -webkit-transform; - opacity: 1; -} -.hinge-out-from-right.mui-leave.mui-leave-active { - -webkit-transform: perspective(2000px) rotateY(-90deg); - transform: perspective(2000px) rotateY(-90deg); - opacity: 0; -} -.hinge-out-from-bottom.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: perspective(2000px) rotate(0deg); - transform: perspective(2000px) rotate(0deg); - -webkit-transform-origin: bottom; - -ms-transform-origin: bottom; - transform-origin: bottom; - transition-property: transform, opacity, -webkit-transform; - opacity: 1; -} -.hinge-out-from-bottom.mui-leave.mui-leave-active { - -webkit-transform: perspective(2000px) rotateX(90deg); - transform: perspective(2000px) rotateX(90deg); - opacity: 0; -} -.hinge-out-from-left.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: perspective(2000px) rotate(0deg); - transform: perspective(2000px) rotate(0deg); - -webkit-transform-origin: left; - -ms-transform-origin: left; - transform-origin: left; - transition-property: transform, opacity, -webkit-transform; - opacity: 1; -} -.hinge-out-from-left.mui-leave.mui-leave-active { - -webkit-transform: perspective(2000px) rotateY(90deg); - transform: perspective(2000px) rotateY(90deg); - opacity: 0; -} -.hinge-out-from-middle-x.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: perspective(2000px) rotate(0deg); - transform: perspective(2000px) rotate(0deg); - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; - transition-property: transform, opacity, -webkit-transform; - opacity: 1; -} -.hinge-out-from-middle-x.mui-leave.mui-leave-active { - -webkit-transform: perspective(2000px) rotateX(-90deg); - transform: perspective(2000px) rotateX(-90deg); - opacity: 0; -} -.hinge-out-from-middle-y.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: perspective(2000px) rotate(0deg); - transform: perspective(2000px) rotate(0deg); - -webkit-transform-origin: center; - -ms-transform-origin: center; - transform-origin: center; - transition-property: transform, opacity, -webkit-transform; - opacity: 1; -} -.hinge-out-from-middle-y.mui-leave.mui-leave-active { - -webkit-transform: perspective(2000px) rotateY(-90deg); - transform: perspective(2000px) rotateY(-90deg); - opacity: 0; -} -.scale-in-up.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: scale(0.5); - -ms-transform: scale(0.5); - transform: scale(0.5); - transition-property: transform, opacity, -webkit-transform; - opacity: 0; -} -.scale-in-up.mui-enter.mui-enter-active { - -webkit-transform: scale(1); - -ms-transform: scale(1); - transform: scale(1); - opacity: 1; -} -.scale-in-down.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: scale(1.5); - -ms-transform: scale(1.5); - transform: scale(1.5); - transition-property: transform, opacity, -webkit-transform; - opacity: 0; -} -.scale-in-down.mui-enter.mui-enter-active { - -webkit-transform: scale(1); - -ms-transform: scale(1); - transform: scale(1); - opacity: 1; -} -.scale-out-up.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: scale(1); - -ms-transform: scale(1); - transform: scale(1); - transition-property: transform, opacity, -webkit-transform; - opacity: 1; -} -.scale-out-up.mui-leave.mui-leave-active { - -webkit-transform: scale(1.5); - -ms-transform: scale(1.5); - transform: scale(1.5); - opacity: 0; -} -.scale-out-down.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: scale(1); - -ms-transform: scale(1); - transform: scale(1); - transition-property: transform, opacity, -webkit-transform; - opacity: 1; -} -.scale-out-down.mui-leave.mui-leave-active { - -webkit-transform: scale(0.5); - -ms-transform: scale(0.5); - transform: scale(0.5); - opacity: 0; -} -.spin-in.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: rotate(-0.75turn); - -ms-transform: rotate(-0.75turn); - transform: rotate(-0.75turn); - transition-property: transform, opacity, -webkit-transform; - opacity: 0; -} -.spin-in.mui-enter.mui-enter-active { - -webkit-transform: rotate(0); - -ms-transform: rotate(0); - transform: rotate(0); - opacity: 1; -} -.spin-out.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: rotate(0); - -ms-transform: rotate(0); - transform: rotate(0); - transition-property: transform, opacity, -webkit-transform; - opacity: 1; -} -.spin-out.mui-leave.mui-leave-active { - -webkit-transform: rotate(0.75turn); - -ms-transform: rotate(0.75turn); - transform: rotate(0.75turn); - opacity: 0; -} -.spin-in-ccw.mui-enter { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: rotate(0.75turn); - -ms-transform: rotate(0.75turn); - transform: rotate(0.75turn); - transition-property: transform, opacity, -webkit-transform; - opacity: 0; -} -.spin-in-ccw.mui-enter.mui-enter-active { - -webkit-transform: rotate(0); - -ms-transform: rotate(0); - transform: rotate(0); - opacity: 1; -} -.spin-out-ccw.mui-leave { - transition-duration: 500ms; - transition-timing-function: linear; - -webkit-transform: rotate(0); - -ms-transform: rotate(0); - transform: rotate(0); - transition-property: transform, opacity, -webkit-transform; - opacity: 1; -} -.spin-out-ccw.mui-leave.mui-leave-active { - -webkit-transform: rotate(-0.75turn); - -ms-transform: rotate(-0.75turn); - transform: rotate(-0.75turn); - opacity: 0; -} -.slow { - transition-duration: 750ms !important; - -webkit-animation-duration: 750ms !important; - animation-duration: 750ms !important; -} -.fast { - transition-duration: 250ms !important; - -webkit-animation-duration: 250ms !important; - animation-duration: 250ms !important; -} -.linear { - transition-timing-function: linear !important; - -webkit-animation-timing-function: linear !important; - animation-timing-function: linear !important; -} -.ease { - transition-timing-function: ease !important; - -webkit-animation-timing-function: ease !important; - animation-timing-function: ease !important; -} -.ease-in { - transition-timing-function: ease-in !important; - -webkit-animation-timing-function: ease-in !important; - animation-timing-function: ease-in !important; -} -.ease-out { - transition-timing-function: ease-out !important; - -webkit-animation-timing-function: ease-out !important; - animation-timing-function: ease-out !important; -} -.ease-in-out { - transition-timing-function: ease-in-out !important; - -webkit-animation-timing-function: ease-in-out !important; - animation-timing-function: ease-in-out !important; -} -.bounce-in { - transition-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; - -webkit-animation-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; - animation-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; -} -.bounce-out { - transition-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; - -webkit-animation-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; - animation-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; -} -.bounce-in-out { - transition-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; - -webkit-animation-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; - animation-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; -} -.short-delay { - transition-delay: 300ms !important; - -webkit-animation-delay: 300ms !important; - animation-delay: 300ms !important; -} -.long-delay { - transition-delay: 700ms !important; - -webkit-animation-delay: 700ms !important; - animation-delay: 700ms !important; -} -.shake { - -webkit-animation-name: shake-7; - animation-name: shake-7; -} - -@keyframes shake-7 { - 0%,10%,20%,30%,40%,50%,60%,70%,80%,90% { - -webkit-transform: translateX(7%); - transform: translateX(7%); - } - 5%,15%,25%,35%,45%,55%,65%,75%,85%,95% { - -webkit-transform: translateX(-7%); - transform: translateX(-7%); - } -} - - -@keyframes shake-7 { - 0%,10%,20%,30%,40%,50%,60%,70%,80%,90% { - -webkit-transform: translateX(7%); - transform: translateX(7%); - } - 5%,15%,25%,35%,45%,55%,65%,75%,85%,95% { - -webkit-transform: translateX(-7%); - transform: translateX(-7%); - } -} - -.spin-cw { - -webkit-animation-name: spin-cw-1turn; - animation-name: spin-cw-1turn; -} - -@keyframes spin-cw-1turn { - 0% { - -webkit-transform: rotate(-1turn); - transform: rotate(-1turn); - } - 100% { - -webkit-transform: rotate(0); - transform: rotate(0); - } -} - - -@keyframes spin-cw-1turn { - 0% { - -webkit-transform: rotate(-1turn); - transform: rotate(-1turn); - } - 100% { - -webkit-transform: rotate(0); - transform: rotate(0); - } -} - -.spin-ccw { - -webkit-animation-name: spin-cw-1turn; - animation-name: spin-cw-1turn; -} - -@keyframes spin-cw-1turn { - 0% { - -webkit-transform: rotate(0); - transform: rotate(0); - } - 100% { - -webkit-transform: rotate(1turn); - transform: rotate(1turn); - } -} - -.wiggle { - -webkit-animation-name: wiggle-7deg; - animation-name: wiggle-7deg; -} - -@keyframes wiggle-7deg { - 40%,50%,60% { - -webkit-transform: rotate(7deg); - transform: rotate(7deg); - } - 35%,45%,55%,65% { - -webkit-transform: rotate(-7deg); - transform: rotate(-7deg); - } - 0%,30%,70%,100% { - -webkit-transform: rotate(0); - transform: rotate(0); - } -} - - -@keyframes wiggle-7deg { - 40%,50%,60% { - -webkit-transform: rotate(7deg); - transform: rotate(7deg); - } - 35%,45%,55%,65% { - -webkit-transform: rotate(-7deg); - transform: rotate(-7deg); - } - 0%,30%,70%,100% { - -webkit-transform: rotate(0); - transform: rotate(0); - } -} - -.shake,.spin-cw,.spin-ccw,.wiggle { - -webkit-animation-duration: 500ms; - animation-duration: 500ms; -} -.infinite { - -webkit-animation-iteration-count: infinite; - animation-iteration-count: infinite; -} -.m-0 { - margin: 0 !important; -} -.m-t-5 { - margin-top: 5px; -} -.m-t-25 { - margin-top: 25px; -} -.m-t-35 { - margin-top: 35px; -} -.m-t-50 { - margin-top: 50px; -} -.m-b-25 { - margin-bottom: 25px; -} -.m-b-50 { - margin-bottom: 50px; -} -.m-b-26 { - margin-bottom: 26px; -} -.m-l-5 { - margin-left: 5px; -} -.m-l-25 { - margin-left: 25px; -} -.m-r-25 { - margin-right: 25px; -} -.m-l-40 { - margin-left: 40px; -} -.p-0 { - padding: 0; -} -.p-lr-15 { - padding-left: 15px; - padding-right: 15px; -} -.p-tb-15 { - padding-top: 15px; - padding-bottom: 15px; -} -.p-tb-25 { - padding-top: 25px; - padding-bottom: 25px; -} -.p-tb-35 { - padding-top: 35px; - padding-bottom: 35px; -} -.p-lr-0 { - padding-left: 0; - padding-right: 0; -} -.p-25 { - padding: 25px !important; -} -.p-b-0 { - padding-bottom: 0 !important; -} -.p-l-0 { - padding-left: 0 !important; -} -.rounded { - border-radius: 7px; -} -.button.long { - padding: 0.9em 4em; - text-transform: uppercase; -} - -.thin { - font-weight: 300 !important; -} -.bolder { - font-weight: 500 !important; -} -.bold { - font-weight: 700 !important; -} -.pointer { - cursor: pointer; -} -.uppercase { - text-transform: uppercase; -} -.underline { - text-decoration: underline; -} -.green-text { - color: #7cad2a !important; -} -.white-text { - color: #fefefe !important; -} -.large-text { - font-size: 1.2rem; -} -.fa-small { - font-size: 1rem; -} -[type="text"],[type="password"],[type="date"],[type="datetime"],[type="datetime-local"],[type="month"],[type="week"],[type="email"],[type="number"],[type="search"],[type="tel"],[type="time"],[type="url"],[type="color"],textarea,[type="text"]:focus,[type="password"]:focus,[type="date"]:focus,[type="datetime"]:focus,[type="datetime-local"]:focus,[type="month"]:focus,[type="week"]:focus,[type="email"]:focus,[type="number"]:focus,[type="search"]:focus,[type="tel"]:focus,[type="time"]:focus,[type="url"]:focus,[type="color"]:focus,textarea:focus { - box-shadow: none; - padding: 0.8rem 1rem; - line-height: 2rem; - height: 3rem; - margin-bottom: 1.4rem; -} -textarea,textarea:focus { - height: 120px; -} -#logo-href { - margin: 50px auto 0; - text-align: center; - display: block; -} -.social-icons { - margin: 70px auto 0; - float: right; -} -.binarity-info { - margin: 30px auto 20px; - float: right; - text-align: right; -} -.binarity-info:before { - content: ''; - width: 25%; - position: relative; - right: 0.7rem; - height: 1px; - background-color: #fefefe; - margin-bottom: 30px; - display: inline-block; -} -#responsive-menu .main-menu { - margin: 70px auto 0; - text-align: right; -} -.off-canvas#responsive-menu .main-menu.menu > li > a { - padding: 0.2rem 0.5rem; - text-transform: uppercase; - letter-spacing: 2px; - font-size: 1.2rem; - color: #fefefe; -} -.off-canvas#responsive-menu .main-menu.menu > li > a:hover,.off-canvas#responsive-menu .main-menu.menu > li.active > a { - text-decoration: none; - color: #414042; -} -.social-icons.menu > li > a { - padding: 0.2rem; -} -.social-icons.menu > li > a > i { - color: #fefefe; -} -.social-icons.menu > li > a:hover > i { - color: #414042; -} -.binarity-info.menu > li { - padding: 0.1rem 0.7rem; - letter-spacing: 2px; - font-size: 0.9rem; - color: #414042; - line-height: 1; -} -.binarity-info.menu > li > a { - padding: 0.1rem 0; - color: #414042; - font-weight: 700; -} -.off-canvas-content { - box-shadow: none; - background: transparent; - padding-top: 25px; - min-height: 100%; - height: 100%; -} -.more-references { - display: none; -} -.more-refs { - display: block; - width: 100%; - clear: both; - margin-bottom: 25px; -} -.reference-item { - margin-bottom: 1rem; -} -.reference-item .holder { - position: relative; - display: inline-block; -} -.item-data { - display: block; - opacity: 0; - width: calc(100% - 14px) !important; - height: calc(100% - 30px); - position: absolute; - top: 7px; - left: 7px; - background-color: rgba(65, 64, 66, 0.85); - font-size: 0.8rem; - text-align: center; - font-weight: 300; - padding: 5px; -} -.item-data p,.item-data a,.item-data h4 { - color: #ffffff; -} -.item-data h4 { - font-size: 1rem; - margin-top: 20px; - display: block; - margin-bottom: 15px; -} -.item-data h4:after { - content: ''; - width: 10%; - height: 1px; - background-color: #fefefe; - display: inline-block; - position: absolute; - top: 50px; - left: 45%; -} -.item-data a { - text-transform: uppercase; -} -.member-list { - border-right: 2px solid #7cad2a; -} -.member { - margin-bottom: 15px; - clear: both; -} -.contact-address { - background-color: #7cad2a; -} -.contact-address div { - margin: 15px auto; -} -.contact-address p,.contact-address b,.contact-address a { - color: #fefefe; - margin: 0; - line-height: 20px; -} -.member-tile p,.member-tile a { - color: #414042; - margin: 0; - line-height: 17px; -} -.avatar-image { - margin: 2px auto 0 auto; - width: 75px; - height: auto; - position: relative; - left: calc(50% - 37px); -} -.what-we-know-holder { - width: 650px; - height: 76px; - position: relative; - margin: 0 auto; -} - -.what-we-know { - position: absolute; - display: inline-block; - background: url(../images/technologies_hexagon.png); - width: 87px; - height: 74px; -} -.what-we-know:nth-child(2) { - left: 70px; -} -.what-we-know:nth-child(3) { - left: 140px; -} -.what-we-know:nth-child(4) { - left: 210px; -} -.what-we-know:nth-child(5) { - left: 280px; -} -.what-we-know:nth-child(6) { - left: 350px; -} -.what-we-know:nth-child(7) { - left: 420px; -} -.what-we-know:nth-child(8) { - left: 490px; -} -.what-we-know:nth-child(9) { - left: 560px; -} -.what-we-know:nth-child(even) { - top: 37px; -} -.what-we-know img { - width: 54px; - height: auto; - position: absolute; - top: 14px; - left: 16px; -} -.services-pos { - position: relative; -} -a#responsive-menu-button { - color: #ffffff; - font-size: 1.5rem; - line-height: 75px; -} -a#responsive-menu-button:hover { - text-decoration: none; -} -#footer { - width: 100%; - display: block; - background-color: #7cad2a; - text-align: center; -} -#footer .social-icons { - margin: 20px auto 0; - float: none; - display: inline-block; -} -#footer .binarity-info { - margin: 5px auto 20px; - float: none; - display: inline-block; - text-align: center; -} -#footer .binarity-info:before { - content: ''; - width: 50px; - position: relative; - left: calc(50% - 95px); - height: 1px; - background-color: #fefefe; - margin-bottom: 5px; - display: inline-block; -} - - -@media only screen and (min-width: 90.063em) { - - .services-pos:nth-child(1) { - top: 0; - margin-top: 302px; - margin-left: 351px; - } - - .services-pos:nth-child(2) { - top: 0; - margin-top: -217px; - margin-left: 489px; - } - .services-pos:nth-child(3) { - top: 0; - margin-top: -138px; - margin-left: 1037px; - } - .services-pos:nth-child(4) { - top: 0; - margin-top: -58px; - margin-left: 625px; - } - .services-pos:nth-child(5) { - top: 0; - margin-top: -138px; - margin-left: 900px; - } - .services-pos:nth-child(6) { - top: 0; - margin-top: -58px; - margin-left: 489px; - } - .services-pos:nth-child(7) { - top: 0; - margin-top: -138px; - margin-left: 762px; - } - .services-pos:nth-child(8) { - top: 0; - margin-top: -138px; - margin-left: 1037px; - } - .services-pos:nth-child(9) { - top: 0; - margin-top: -58px; - margin-left: 625px; - } - .services-pos:nth-child(10) { - top: 0; - margin-top: -138px; - margin-left: 900px; - } - .services-pos:nth-child(11) { - top: 0; - margin-top: -58px; - margin-left: 762px; - } - .services-pos:nth-child(12) { - top: 0; - margin-top: -58px; - margin-left: 900px; - } -} - - - -@media only screen and (min-width: 64.063em) and (max-width: 90em) { - - .services-pos:nth-child(1) { - top: 0; - margin-top: 143px; - margin-left: 76px; - } - .services-pos:nth-child(2) { - top: 0; - margin-top: -217px; - margin-left: 214px; - } - .services-pos:nth-child(3) { - top: 0; - margin-top: -138px; - margin-left: 762px; - } - .services-pos:nth-child(4) { - top: 0; - margin-top: -58px; - margin-left: 350px; - } - .services-pos:nth-child(5) { - top: 0; - margin-top: -138px; - margin-left: 625px; - } - .services-pos:nth-child(6) { - top: 0; - margin-top: -58px; - margin-left: 214px; - } - .services-pos:nth-child(7) { - top: 0; - margin-top: -138px; - margin-left: 487px; - } - .services-pos:nth-child(8) { - top: 0; - margin-top: -138px; - margin-left: 762px; - } - .services-pos:nth-child(9) { - top: 0; - margin-top: -58px; - margin-left: 350px; - } - .services-pos:nth-child(10) { - top: 0; - margin-top: -138px; - margin-left: 625px; - } - .services-pos:nth-child(11) { - top: 0; - margin-top: -58px; - margin-left: 487px; - } - .services-pos:nth-child(12) { - top: 0; - margin-top: -58px; - margin-left: 625px; - } -} - - - -@media only screen and (min-width: 40.063em) and (max-width: 64em) { - - .services-pos:nth-child(1) { - top: 0; - margin-top: 126px; - margin-left: 190px; - } - .services-pos:nth-child(2) { - top: 0; - margin-top: -217px; - margin-left: 328px; - } - .services-pos:nth-child(3) { - top: 313px; - margin-top: -138px; - margin-left: 328px; - } - .services-pos:nth-child(4) { - top: 0; - margin-top: -58px; - margin-left: 464px; - } - .services-pos:nth-child(5) { - top: -80px; - margin-top: -134px; - margin-left: 601px; - } - .services-pos:nth-child(6) { - top: 0; - margin-top: -58px; - margin-left: 328px; - } - .services-pos:nth-child(7) { - top: 0; - margin-top: -138px; - margin-left: 601px; - } - .services-pos:nth-child(8) { - top: 80px; - margin-top: -138px; - margin-left: 190px; - } - .services-pos:nth-child(9) { - top: 0; - margin-top: -58px; - margin-left: 464px; - } - .services-pos:nth-child(10) { - top: 160px; - margin-top: -138px; - margin-left: 190px; - } - .services-pos:nth-child(11) { - top: 0; - margin-top: -58px; - margin-left: 601px; - } - .services-pos:nth-child(12) { - top: 0; - margin-top: -58px; - margin-left: 464px; - } -} - - - -@media only screen and (max-width: 40em) { - - .outline-holder { - display: none; - } - .services-pos:nth-child(2) { - left: calc(50% - 150px); - } - .services-pos:nth-child(4) { - margin-top: 10px; - left: calc(50% - 150px); - } - .services-pos:nth-child(6) { - left: calc(50% - 15px); - margin-top: -210px; - } - .services-pos:nth-child(7) { - left: calc(50% - 15px); - margin-top: 10px; - } - .services-pos:nth-child(8) { - left: calc(50% - 150px); - margin-top: -65px; - } - .services-pos:nth-child(9) { - left: calc(50% - 15px); - margin-top: -60px; - } - .services-pos:nth-child(10) { - left: calc(50% - 150px); - margin-top: -65px; - } - .services-pos:nth-child(12) { - left: calc(50% - 15px); - margin-top: -60px; - } -} - - - -@media only screen and (max-width: 1270px) and (min-width: 64.063em) { - - .services-pos:nth-child(3) { - margin-top: -138px; - top: 313px; - margin-left: 214px; - } - .services-pos:nth-child(8) { - margin-top: -138px; - top: 80px; - margin-left: 76px; - } - .services-pos:nth-child(12) { - margin-left: 350px; - } -} - - -@media only screen and (min-width: 40.063em) and (max-width: 850px) { - - .services-pos:nth-child(5) { - margin-left: 53px; - } - .services-pos:nth-child(7) { - margin-left: 53px; - } - .services-pos:nth-child(11) { - margin-left: 53px; - } -} - - -@media (max-width: 1366px) { - - .row:not(.nochange) { - max-width: 60rem; - } -} - - -@media (max-width: 1270px) { - - .row:not(.nochange) { - max-width: 50rem; - } - h2,h5 { - text-align: center; - margin: auto; - } - .what-we-know-holder { - left: calc(50% - 650px / 2); - } -} - - -@media (max-width: 1100px) { - - .row:not(.nochange) { - max-width: 40rem; - } -} - - -@media (min-width: 1024px) { - - .medium-centered { - float: none; - display: block; - margin-left: 0; - margin-right: 0; - } -} - - -@media (max-width: 1023px) { - - .row:not(.nochange) { - max-width: 50rem; - } - .off-canvas-content { - padding-top: 0; - } - .item-data { - padding: 15px; - } - .item-data h4::after { - top: 60px; - } - .item-data a.button { - margin-top: 10px; - } - .ref-scr { - padding-left: 0.3rem; - padding-right: 0.3rem; - } - .detail-info { - padding-left: 1.5rem !important; - padding-right: 1.5rem !important; - } - .detail-buttons { - text-align: center; - } - .pull-right-for-small { - float: right; - } - [type="text"],[type="password"],[type="date"],[type="datetime"],[type="datetime-local"],[type="month"],[type="week"],[type="email"],[type="number"],[type="search"],[type="tel"],[type="time"],[type="url"],[type="color"],textarea,[type="text"]:focus,[type="password"]:focus,[type="date"]:focus,[type="datetime"]:focus,[type="datetime-local"]:focus,[type="month"]:focus,[type="week"]:focus,[type="email"]:focus,[type="number"]:focus,[type="search"]:focus,[type="tel"]:focus,[type="time"]:focus,[type="url"]:focus,[type="color"]:focus,textarea:focus { - margin-bottom: 0.4rem; - } - .button-medium-centered { - margin: auto; - text-align: center; - display: block; - } - .member-list { - margin-top: 25px; - border-right: 0; - } - .contact-address,.members { - float: left; - width: 50%; - } - .contact-address .small-8 { - text-align: right; - padding-top: 30px; - padding-bottom: 30px; - } - .members { - margin-top: 0; - } - .off-canvas { - background-color: rgba(88, 89, 91, 0.95); - } - #responsive-menu .main-menu { - text-align: center; - } - .off-canvas#responsive-menu .main-menu.menu > li > a { - font-size: 1.7rem; - } - .off-canvas#responsive-menu .main-menu.menu > li > a:hover,.off-canvas#responsive-menu .main-menu.menu > li.active > a { - color: #7cad2a; - } - .off-canvas#responsive-menu .main-menu.menu > li.active > a { - font-size: 2.2rem; - } -} - - -@media (max-width: 850px) { - - .row:not(.nochange) { - max-width: 45rem; - } - .item-data { - padding: 5px; - font-size: 0.8rem; - } - .item-data h4 { - margin-top: 5px; - margin-bottom: 5px; - } - .item-data h4::after { - top: 35px; - } - .item-data a.button { - margin-top: 10px; - } - .item-data p { - line-height: 1.2; - } -} - - -@media (max-width: 750px) { - - .row:not(.nochange) { - max-width: 40rem; - } -} - - -@media (max-width: 639px) { - - .row:not(.nochange) { - max-width: 30rem; - } - .ref-scr { - margin-bottom: 0; - } - .detail-info { - margin-top: 15px; - } - .item-data p,.item-data a,.item-data h4 { - color: #ffffff; - } - .item-data h4 { - font-size: 1rem; - margin-top: 20px; - display: block; - margin-bottom: 15px; - } - .item-data h4:after { - content: ''; - width: 10%; - height: 1px; - background-color: #fefefe; - display: inline-block; - position: absolute; - top: 50px; - left: 45%; - } - .item-data a { - text-transform: uppercase; - } -} - - -@media (max-width: 530px) { - - .row:not(.nochange) { - padding-left: 20px; - padding-right: 20px; - } - .detail-buttons .m-l-25 { - margin-left: 0; - } -} - - -@media (max-width: 500px) { - - .item-data h4:after { - display: none; - } - .item-data h4 { - margin-top: 10px; - margin-bottom: 5px; - } - .item-data p { - display: none; - } - .item-data a.button { - margin-top: 0; - } - .contact-address .small-4 { - display: none; - } - .contact-address,.members,.contact-address .small-8 { - float: left; - width: 100%; - } - .contact-address .small-8 { - text-align: center; - } - .members { - margin-top: 25px; - } - .what-we-know-holder { - left: 0; - height: 152px; - } - .what-we-know:nth-child(2) { - left: 70px; - } - .what-we-know:nth-child(3) { - left: 140px; - } - .what-we-know:nth-child(4) { - left: 210px; - } - .what-we-know:nth-child(5) { - left: 280px; - } - .what-we-know:nth-child(6) { - left: 0; - top: 76px; - } - .what-we-know:nth-child(7) { - left: 70px; - top: 114px; - } - .what-we-know:nth-child(8) { - left: 140px; - top: 76px; - } - .what-we-know:nth-child(9) { - left: 210px; - top: 114px; - } -} - - -@media (max-width: 400px) { - - .title-bar-title img { - width: 100px; - height: auto; - margin-top: 17px; - } - a#responsive-menu-button { - font-size: 1rem; - } - .off-canvas#responsive-menu .main-menu.menu > li > a { - font-size: 1.3rem; - } - .off-canvas#responsive-menu .main-menu.menu > li.active > a { - font-size: 1.6rem; - } -} - -.dark-background { - background-color: #58595b; - color: #fefefe; - padding: 1em; -} - -.dark-background h2, .dark-background h3 { - text-align: center; -} - -.dark-background table { - color: #fefefe; - width: 85%; - margin: 0 auto; - border: none; -} -.dark-background table tbody { - border: none; - background-color: transparent !important; -} - -.dark-background table td:nth-child(2) { - text-align: right; -} - -.dark-background table tbody tr,.dark-background table tbody tr:nth-child(2n) { - background-color: transparent !important; -} -.dark-background table tbody tr td { - padding: 0.2rem 0.625rem 0.2rem 0; - border: none; -} -.dark-background table tbody tr td:first-child:before { - content: '•'; - margin-right: 5px; - color: #7cad2a; -} - - -.flip-container { - -webkit-perspective: 1000px; - perspective: 1000px; -} - -.flip-container:hover .flipper,.flip-container.hover .flipper { - -webkit-transform: rotateY(180deg); - transform: rotateY(180deg); -} -.flip-container,.front,.back { - width: 165px; - height: 137px; -} - -.flipper { - transition: 0.6s; - -webkit-transform-style: preserve-3d; - transform-style: preserve-3d; - position: relative; -} - -.front,.back { - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - position: absolute; - top: 0; - left: 0; -} - -.front { - z-index: 2; - color: #ffffff; - text-transform: uppercase; - text-align: center; - font-weight: 500; - padding-top: 27%; - -webkit-transform: rotateY(0deg); - transform: rotateY(0deg); - background: url(../images/hexagon_grey.png); - background-size: cover; -} -.outline { - position: absolute; - width: 166px; - height: 137px; - z-index: 2; - background: url(../images/hexagon_green_outline.png); - background-size: cover; -} -.outline-grey { - position: absolute; - width: 165px; - height: 137px; - z-index: 2; - background: url(../images/hexagon_grey_outline.png); - background-size: cover; -} - -.back { - color: #ffffff; - text-align: center; - font-weight: 500; - padding-top: 18%; - -webkit-transform: rotateY(180deg); - transform: rotateY(180deg); - background: url(../images/hexagon_green.png); - background-size: cover; -} - -.b-lightbox-holder { - background-color: rgba(10, 10, 10, 0.85); - width: 100%; - height: 100%; - position: fixed; - top: 0; - left: 0; - display: none; - z-index: 1000; -} -.b-lightbox-image { - display: none; - border-radius: 0; - max-height: 90%; - max-width: 90%; - position: fixed; - margin: 0 auto; - z-index: 1001; -} -.b-lightbox-close-button { - z-index: 1100; - display: block; - position: fixed; - top: 8px; - right: 8px; - font-size: 14px; - color: rgba(254, 254, 254, 0.8); - cursor: pointer; - font-weight: 700; -} -.b-lightbox-close-button:hover { - font-weight: 700; -} -.b-lightbox-direction { - z-index: 1050; - height: 100%; - font-size: 10em; - cursor: pointer; - display: inline-block; - min-width: 10%; - text-align: center; - position: absolute; - top: 0; -} -.b-lightbox-direction.next { - right: 0; -} -.b-lightbox-direction.previous { - left: 0; -} -.b-lightbox-direction:hover { - background-color: rgba(254, 254, 254, 0.1); - text-decoration: none; -} -.b-lightbox-direction:before { - content: ''; - height: 35%; - display: block; - width: 100%; -} -.b-lightbox-label { - box-sizing: border-box; - display: none; - z-index: 1015; - background-color: rgba(65, 64, 66, 0.9); - color: rgba(254, 254, 254, 0.95); - font-weight: 500; - position: absolute; - padding: 10px; - font-size: 13px; -} -@charset "UTF-8"; - - - - - - - - -article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary { - display: block; -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@media screen and (min-width: 40em) { - - .row .row { - margin-left: -0.9375rem; - margin-right: -0.9375rem; - } -} - - -@media screen and (min-width: 40em) { - - .column,.columns { - padding-left: 0.9375rem; - padding-right: 0.9375rem; - } -} - - -@media screen and (min-width: 40em) { - - .medium-1 { - width: 8.33333%; - } - .medium-push-1 { - position: relative; - left: 8.33333%; - } - .medium-pull-1 { - position: relative; - left: -8.33333%; - } - .medium-offset-0 { - margin-left: 0%; - } - .medium-2 { - width: 16.66667%; - } - .medium-push-2 { - position: relative; - left: 16.66667%; - } - .medium-pull-2 { - position: relative; - left: -16.66667%; - } - .medium-offset-1 { - margin-left: 8.33333%; - } - .medium-3 { - width: 25%; - } - .medium-push-3 { - position: relative; - left: 25%; - } - .medium-pull-3 { - position: relative; - left: -25%; - } - .medium-offset-2 { - margin-left: 16.66667%; - } - .medium-4 { - width: 33.33333%; - } - .medium-push-4 { - position: relative; - left: 33.33333%; - } - .medium-pull-4 { - position: relative; - left: -33.33333%; - } - .medium-offset-3 { - margin-left: 25%; - } - .medium-5 { - width: 41.66667%; - } - .medium-push-5 { - position: relative; - left: 41.66667%; - } - .medium-pull-5 { - position: relative; - left: -41.66667%; - } - .medium-offset-4 { - margin-left: 33.33333%; - } - .medium-6 { - width: 50%; - } - .medium-push-6 { - position: relative; - left: 50%; - } - .medium-pull-6 { - position: relative; - left: -50%; - } - .medium-offset-5 { - margin-left: 41.66667%; - } - .medium-7 { - width: 58.33333%; - } - .medium-push-7 { - position: relative; - left: 58.33333%; - } - .medium-pull-7 { - position: relative; - left: -58.33333%; - } - .medium-offset-6 { - margin-left: 50%; - } - .medium-8 { - width: 66.66667%; - } - .medium-push-8 { - position: relative; - left: 66.66667%; - } - .medium-pull-8 { - position: relative; - left: -66.66667%; - } - .medium-offset-7 { - margin-left: 58.33333%; - } - .medium-9 { - width: 75%; - } - .medium-push-9 { - position: relative; - left: 75%; - } - .medium-pull-9 { - position: relative; - left: -75%; - } - .medium-offset-8 { - margin-left: 66.66667%; - } - .medium-10 { - width: 83.33333%; - } - .medium-push-10 { - position: relative; - left: 83.33333%; - } - .medium-pull-10 { - position: relative; - left: -83.33333%; - } - .medium-offset-9 { - margin-left: 75%; - } - .medium-11 { - width: 91.66667%; - } - .medium-push-11 { - position: relative; - left: 91.66667%; - } - .medium-pull-11 { - position: relative; - left: -91.66667%; - } - .medium-offset-10 { - margin-left: 83.33333%; - } - .medium-12 { - width: 100%; - } - .medium-offset-11 { - margin-left: 91.66667%; - } - .medium-up-1 > .column,.medium-up-1 > .columns { - width: 100%; - float: left; - } - .medium-up-1 > .column:nth-of-type(1n),.medium-up-1 > .columns:nth-of-type(1n) { - clear: none; - } - .medium-up-1 > .column:nth-of-type(1n+1),.medium-up-1 > .columns:nth-of-type(1n+1) { - clear: both; - } - .medium-up-1 > .column:last-child,.medium-up-1 > .columns:last-child { - float: left; - } - .medium-up-2 > .column,.medium-up-2 > .columns { - width: 50%; - float: left; - } - .medium-up-2 > .column:nth-of-type(1n),.medium-up-2 > .columns:nth-of-type(1n) { - clear: none; - } - .medium-up-2 > .column:nth-of-type(2n+1),.medium-up-2 > .columns:nth-of-type(2n+1) { - clear: both; - } - .medium-up-2 > .column:last-child,.medium-up-2 > .columns:last-child { - float: left; - } - .medium-up-3 > .column,.medium-up-3 > .columns { - width: 33.33333%; - float: left; - } - .medium-up-3 > .column:nth-of-type(1n),.medium-up-3 > .columns:nth-of-type(1n) { - clear: none; - } - .medium-up-3 > .column:nth-of-type(3n+1),.medium-up-3 > .columns:nth-of-type(3n+1) { - clear: both; - } - .medium-up-3 > .column:last-child,.medium-up-3 > .columns:last-child { - float: left; - } - .medium-up-4 > .column,.medium-up-4 > .columns { - width: 25%; - float: left; - } - .medium-up-4 > .column:nth-of-type(1n),.medium-up-4 > .columns:nth-of-type(1n) { - clear: none; - } - .medium-up-4 > .column:nth-of-type(4n+1),.medium-up-4 > .columns:nth-of-type(4n+1) { - clear: both; - } - .medium-up-4 > .column:last-child,.medium-up-4 > .columns:last-child { - float: left; - } - .medium-up-5 > .column,.medium-up-5 > .columns { - width: 20%; - float: left; - } - .medium-up-5 > .column:nth-of-type(1n),.medium-up-5 > .columns:nth-of-type(1n) { - clear: none; - } - .medium-up-5 > .column:nth-of-type(5n+1),.medium-up-5 > .columns:nth-of-type(5n+1) { - clear: both; - } - .medium-up-5 > .column:last-child,.medium-up-5 > .columns:last-child { - float: left; - } - .medium-up-6 > .column,.medium-up-6 > .columns { - width: 16.66667%; - float: left; - } - .medium-up-6 > .column:nth-of-type(1n),.medium-up-6 > .columns:nth-of-type(1n) { - clear: none; - } - .medium-up-6 > .column:nth-of-type(6n+1),.medium-up-6 > .columns:nth-of-type(6n+1) { - clear: both; - } - .medium-up-6 > .column:last-child,.medium-up-6 > .columns:last-child { - float: left; - } - .medium-up-7 > .column,.medium-up-7 > .columns { - width: 14.28571%; - float: left; - } - .medium-up-7 > .column:nth-of-type(1n),.medium-up-7 > .columns:nth-of-type(1n) { - clear: none; - } - .medium-up-7 > .column:nth-of-type(7n+1),.medium-up-7 > .columns:nth-of-type(7n+1) { - clear: both; - } - .medium-up-7 > .column:last-child,.medium-up-7 > .columns:last-child { - float: left; - } - .medium-up-8 > .column,.medium-up-8 > .columns { - width: 12.5%; - float: left; - } - .medium-up-8 > .column:nth-of-type(1n),.medium-up-8 > .columns:nth-of-type(1n) { - clear: none; - } - .medium-up-8 > .column:nth-of-type(8n+1),.medium-up-8 > .columns:nth-of-type(8n+1) { - clear: both; - } - .medium-up-8 > .column:last-child,.medium-up-8 > .columns:last-child { - float: left; - } - .medium-collapse > .column,.medium-collapse > .columns { - padding-left: 0; - padding-right: 0; - } - .medium-collapse .row { - margin-left: 0; - margin-right: 0; - } - .medium-uncollapse > .column,.medium-uncollapse > .columns { - padding-left: 0.9375rem; - padding-right: 0.9375rem; - } - .medium-centered { - float: none; - margin-left: auto; - margin-right: auto; - } - .medium-uncentered,.medium-push-0,.medium-pull-0 { - position: static; - margin-left: 0; - margin-right: 0; - float: left; - } -} - - -@media screen and (min-width: 64em) { - - .large-1 { - width: 8.33333%; - } - .large-push-1 { - position: relative; - left: 8.33333%; - } - .large-pull-1 { - position: relative; - left: -8.33333%; - } - .large-offset-0 { - margin-left: 0%; - } - .large-2 { - width: 16.66667%; - } - .large-push-2 { - position: relative; - left: 16.66667%; - } - .large-pull-2 { - position: relative; - left: -16.66667%; - } - .large-offset-1 { - margin-left: 8.33333%; - } - .large-3 { - width: 25%; - } - .large-push-3 { - position: relative; - left: 25%; - } - .large-pull-3 { - position: relative; - left: -25%; - } - .large-offset-2 { - margin-left: 16.66667%; - } - .large-4 { - width: 33.33333%; - } - .large-push-4 { - position: relative; - left: 33.33333%; - } - .large-pull-4 { - position: relative; - left: -33.33333%; - } - .large-offset-3 { - margin-left: 25%; - } - .large-5 { - width: 41.66667%; - } - .large-push-5 { - position: relative; - left: 41.66667%; - } - .large-pull-5 { - position: relative; - left: -41.66667%; - } - .large-offset-4 { - margin-left: 33.33333%; - } - .large-6 { - width: 50%; - } - .large-push-6 { - position: relative; - left: 50%; - } - .large-pull-6 { - position: relative; - left: -50%; - } - .large-offset-5 { - margin-left: 41.66667%; - } - .large-7 { - width: 58.33333%; - } - .large-push-7 { - position: relative; - left: 58.33333%; - } - .large-pull-7 { - position: relative; - left: -58.33333%; - } - .large-offset-6 { - margin-left: 50%; - } - .large-8 { - width: 66.66667%; - } - .large-push-8 { - position: relative; - left: 66.66667%; - } - .large-pull-8 { - position: relative; - left: -66.66667%; - } - .large-offset-7 { - margin-left: 58.33333%; - } - .large-9 { - width: 75%; - } - .large-push-9 { - position: relative; - left: 75%; - } - .large-pull-9 { - position: relative; - left: -75%; - } - .large-offset-8 { - margin-left: 66.66667%; - } - .large-10 { - width: 83.33333%; - } - .large-push-10 { - position: relative; - left: 83.33333%; - } - .large-pull-10 { - position: relative; - left: -83.33333%; - } - .large-offset-9 { - margin-left: 75%; - } - .large-11 { - width: 91.66667%; - } - .large-push-11 { - position: relative; - left: 91.66667%; - } - .large-pull-11 { - position: relative; - left: -91.66667%; - } - .large-offset-10 { - margin-left: 83.33333%; - } - .large-12 { - width: 100%; - } - .large-offset-11 { - margin-left: 91.66667%; - } - .large-up-1 > .column,.large-up-1 > .columns { - width: 100%; - float: left; - } - .large-up-1 > .column:nth-of-type(1n),.large-up-1 > .columns:nth-of-type(1n) { - clear: none; - } - .large-up-1 > .column:nth-of-type(1n+1),.large-up-1 > .columns:nth-of-type(1n+1) { - clear: both; - } - .large-up-1 > .column:last-child,.large-up-1 > .columns:last-child { - float: left; - } - .large-up-2 > .column,.large-up-2 > .columns { - width: 50%; - float: left; - } - .large-up-2 > .column:nth-of-type(1n),.large-up-2 > .columns:nth-of-type(1n) { - clear: none; - } - .large-up-2 > .column:nth-of-type(2n+1),.large-up-2 > .columns:nth-of-type(2n+1) { - clear: both; - } - .large-up-2 > .column:last-child,.large-up-2 > .columns:last-child { - float: left; - } - .large-up-3 > .column,.large-up-3 > .columns { - width: 33.33333%; - float: left; - } - .large-up-3 > .column:nth-of-type(1n),.large-up-3 > .columns:nth-of-type(1n) { - clear: none; - } - .large-up-3 > .column:nth-of-type(3n+1),.large-up-3 > .columns:nth-of-type(3n+1) { - clear: both; - } - .large-up-3 > .column:last-child,.large-up-3 > .columns:last-child { - float: left; - } - .large-up-4 > .column,.large-up-4 > .columns { - width: 25%; - float: left; - } - .large-up-4 > .column:nth-of-type(1n),.large-up-4 > .columns:nth-of-type(1n) { - clear: none; - } - .large-up-4 > .column:nth-of-type(4n+1),.large-up-4 > .columns:nth-of-type(4n+1) { - clear: both; - } - .large-up-4 > .column:last-child,.large-up-4 > .columns:last-child { - float: left; - } - .large-up-5 > .column,.large-up-5 > .columns { - width: 20%; - float: left; - } - .large-up-5 > .column:nth-of-type(1n),.large-up-5 > .columns:nth-of-type(1n) { - clear: none; - } - .large-up-5 > .column:nth-of-type(5n+1),.large-up-5 > .columns:nth-of-type(5n+1) { - clear: both; - } - .large-up-5 > .column:last-child,.large-up-5 > .columns:last-child { - float: left; - } - .large-up-6 > .column,.large-up-6 > .columns { - width: 16.66667%; - float: left; - } - .large-up-6 > .column:nth-of-type(1n),.large-up-6 > .columns:nth-of-type(1n) { - clear: none; - } - .large-up-6 > .column:nth-of-type(6n+1),.large-up-6 > .columns:nth-of-type(6n+1) { - clear: both; - } - .large-up-6 > .column:last-child,.large-up-6 > .columns:last-child { - float: left; - } - .large-up-7 > .column,.large-up-7 > .columns { - width: 14.28571%; - float: left; - } - .large-up-7 > .column:nth-of-type(1n),.large-up-7 > .columns:nth-of-type(1n) { - clear: none; - } - .large-up-7 > .column:nth-of-type(7n+1),.large-up-7 > .columns:nth-of-type(7n+1) { - clear: both; - } - .large-up-7 > .column:last-child,.large-up-7 > .columns:last-child { - float: left; - } - .large-up-8 > .column,.large-up-8 > .columns { - width: 12.5%; - float: left; - } - .large-up-8 > .column:nth-of-type(1n),.large-up-8 > .columns:nth-of-type(1n) { - clear: none; - } - .large-up-8 > .column:nth-of-type(8n+1),.large-up-8 > .columns:nth-of-type(8n+1) { - clear: both; - } - .large-up-8 > .column:last-child,.large-up-8 > .columns:last-child { - float: left; - } - .large-collapse > .column,.large-collapse > .columns { - padding-left: 0; - padding-right: 0; - } - .large-collapse .row { - margin-left: 0; - margin-right: 0; - } - .large-uncollapse > .column,.large-uncollapse > .columns { - padding-left: 0.9375rem; - padding-right: 0.9375rem; - } - .large-centered { - float: none; - margin-left: auto; - margin-right: auto; - } - .large-uncentered,.large-push-0,.large-pull-0 { - position: static; - margin-left: 0; - margin-right: 0; - float: left; - } -} - - -@media screen and (min-width: 75em) { - - .xlarge-1 { - width: 8.33333%; - } - .xlarge-push-1 { - position: relative; - left: 8.33333%; - } - .xlarge-pull-1 { - position: relative; - left: -8.33333%; - } - .xlarge-offset-0 { - margin-left: 0%; - } - .xlarge-2 { - width: 16.66667%; - } - .xlarge-push-2 { - position: relative; - left: 16.66667%; - } - .xlarge-pull-2 { - position: relative; - left: -16.66667%; - } - .xlarge-offset-1 { - margin-left: 8.33333%; - } - .xlarge-3 { - width: 25%; - } - .xlarge-push-3 { - position: relative; - left: 25%; - } - .xlarge-pull-3 { - position: relative; - left: -25%; - } - .xlarge-offset-2 { - margin-left: 16.66667%; - } - .xlarge-4 { - width: 33.33333%; - } - .xlarge-push-4 { - position: relative; - left: 33.33333%; - } - .xlarge-pull-4 { - position: relative; - left: -33.33333%; - } - .xlarge-offset-3 { - margin-left: 25%; - } - .xlarge-5 { - width: 41.66667%; - } - .xlarge-push-5 { - position: relative; - left: 41.66667%; - } - .xlarge-pull-5 { - position: relative; - left: -41.66667%; - } - .xlarge-offset-4 { - margin-left: 33.33333%; - } - .xlarge-6 { - width: 50%; - } - .xlarge-push-6 { - position: relative; - left: 50%; - } - .xlarge-pull-6 { - position: relative; - left: -50%; - } - .xlarge-offset-5 { - margin-left: 41.66667%; - } - .xlarge-7 { - width: 58.33333%; - } - .xlarge-push-7 { - position: relative; - left: 58.33333%; - } - .xlarge-pull-7 { - position: relative; - left: -58.33333%; - } - .xlarge-offset-6 { - margin-left: 50%; - } - .xlarge-8 { - width: 66.66667%; - } - .xlarge-push-8 { - position: relative; - left: 66.66667%; - } - .xlarge-pull-8 { - position: relative; - left: -66.66667%; - } - .xlarge-offset-7 { - margin-left: 58.33333%; - } - .xlarge-9 { - width: 75%; - } - .xlarge-push-9 { - position: relative; - left: 75%; - } - .xlarge-pull-9 { - position: relative; - left: -75%; - } - .xlarge-offset-8 { - margin-left: 66.66667%; - } - .xlarge-10 { - width: 83.33333%; - } - .xlarge-push-10 { - position: relative; - left: 83.33333%; - } - .xlarge-pull-10 { - position: relative; - left: -83.33333%; - } - .xlarge-offset-9 { - margin-left: 75%; - } - .xlarge-11 { - width: 91.66667%; - } - .xlarge-push-11 { - position: relative; - left: 91.66667%; - } - .xlarge-pull-11 { - position: relative; - left: -91.66667%; - } - .xlarge-offset-10 { - margin-left: 83.33333%; - } - .xlarge-12 { - width: 100%; - } - .xlarge-offset-11 { - margin-left: 91.66667%; - } - .xlarge-up-1 > .column,.xlarge-up-1 > .columns { - width: 100%; - float: left; - } - .xlarge-up-1 > .column:nth-of-type(1n),.xlarge-up-1 > .columns:nth-of-type(1n) { - clear: none; - } - .xlarge-up-1 > .column:nth-of-type(1n+1),.xlarge-up-1 > .columns:nth-of-type(1n+1) { - clear: both; - } - .xlarge-up-1 > .column:last-child,.xlarge-up-1 > .columns:last-child { - float: left; - } - .xlarge-up-2 > .column,.xlarge-up-2 > .columns { - width: 50%; - float: left; - } - .xlarge-up-2 > .column:nth-of-type(1n),.xlarge-up-2 > .columns:nth-of-type(1n) { - clear: none; - } - .xlarge-up-2 > .column:nth-of-type(2n+1),.xlarge-up-2 > .columns:nth-of-type(2n+1) { - clear: both; - } - .xlarge-up-2 > .column:last-child,.xlarge-up-2 > .columns:last-child { - float: left; - } - .xlarge-up-3 > .column,.xlarge-up-3 > .columns { - width: 33.33333%; - float: left; - } - .xlarge-up-3 > .column:nth-of-type(1n),.xlarge-up-3 > .columns:nth-of-type(1n) { - clear: none; - } - .xlarge-up-3 > .column:nth-of-type(3n+1),.xlarge-up-3 > .columns:nth-of-type(3n+1) { - clear: both; - } - .xlarge-up-3 > .column:last-child,.xlarge-up-3 > .columns:last-child { - float: left; - } - .xlarge-up-4 > .column,.xlarge-up-4 > .columns { - width: 25%; - float: left; - } - .xlarge-up-4 > .column:nth-of-type(1n),.xlarge-up-4 > .columns:nth-of-type(1n) { - clear: none; - } - .xlarge-up-4 > .column:nth-of-type(4n+1),.xlarge-up-4 > .columns:nth-of-type(4n+1) { - clear: both; - } - .xlarge-up-4 > .column:last-child,.xlarge-up-4 > .columns:last-child { - float: left; - } - .xlarge-up-5 > .column,.xlarge-up-5 > .columns { - width: 20%; - float: left; - } - .xlarge-up-5 > .column:nth-of-type(1n),.xlarge-up-5 > .columns:nth-of-type(1n) { - clear: none; - } - .xlarge-up-5 > .column:nth-of-type(5n+1),.xlarge-up-5 > .columns:nth-of-type(5n+1) { - clear: both; - } - .xlarge-up-5 > .column:last-child,.xlarge-up-5 > .columns:last-child { - float: left; - } - .xlarge-up-6 > .column,.xlarge-up-6 > .columns { - width: 16.66667%; - float: left; - } - .xlarge-up-6 > .column:nth-of-type(1n),.xlarge-up-6 > .columns:nth-of-type(1n) { - clear: none; - } - .xlarge-up-6 > .column:nth-of-type(6n+1),.xlarge-up-6 > .columns:nth-of-type(6n+1) { - clear: both; - } - .xlarge-up-6 > .column:last-child,.xlarge-up-6 > .columns:last-child { - float: left; - } - .xlarge-up-7 > .column,.xlarge-up-7 > .columns { - width: 14.28571%; - float: left; - } - .xlarge-up-7 > .column:nth-of-type(1n),.xlarge-up-7 > .columns:nth-of-type(1n) { - clear: none; - } - .xlarge-up-7 > .column:nth-of-type(7n+1),.xlarge-up-7 > .columns:nth-of-type(7n+1) { - clear: both; - } - .xlarge-up-7 > .column:last-child,.xlarge-up-7 > .columns:last-child { - float: left; - } - .xlarge-up-8 > .column,.xlarge-up-8 > .columns { - width: 12.5%; - float: left; - } - .xlarge-up-8 > .column:nth-of-type(1n),.xlarge-up-8 > .columns:nth-of-type(1n) { - clear: none; - } - .xlarge-up-8 > .column:nth-of-type(8n+1),.xlarge-up-8 > .columns:nth-of-type(8n+1) { - clear: both; - } - .xlarge-up-8 > .column:last-child,.xlarge-up-8 > .columns:last-child { - float: left; - } - .xlarge-collapse > .column,.xlarge-collapse > .columns { - padding-left: 0; - padding-right: 0; - } - .xlarge-collapse .row { - margin-left: 0; - margin-right: 0; - } - .xlarge-uncollapse > .column,.xlarge-uncollapse > .columns { - padding-left: 0.9375rem; - padding-right: 0.9375rem; - } - .xlarge-centered { - float: none; - margin-left: auto; - margin-right: auto; - } - .xlarge-uncentered,.xlarge-push-0,.xlarge-pull-0 { - position: static; - margin-left: 0; - margin-right: 0; - float: left; - } -} - - -@media screen and (min-width: 90em) { - - .xxlarge-1 { - width: 8.33333%; - } - .xxlarge-push-1 { - position: relative; - left: 8.33333%; - } - .xxlarge-pull-1 { - position: relative; - left: -8.33333%; - } - .xxlarge-offset-0 { - margin-left: 0%; - } - .xxlarge-2 { - width: 16.66667%; - } - .xxlarge-push-2 { - position: relative; - left: 16.66667%; - } - .xxlarge-pull-2 { - position: relative; - left: -16.66667%; - } - .xxlarge-offset-1 { - margin-left: 8.33333%; - } - .xxlarge-3 { - width: 25%; - } - .xxlarge-push-3 { - position: relative; - left: 25%; - } - .xxlarge-pull-3 { - position: relative; - left: -25%; - } - .xxlarge-offset-2 { - margin-left: 16.66667%; - } - .xxlarge-4 { - width: 33.33333%; - } - .xxlarge-push-4 { - position: relative; - left: 33.33333%; - } - .xxlarge-pull-4 { - position: relative; - left: -33.33333%; - } - .xxlarge-offset-3 { - margin-left: 25%; - } - .xxlarge-5 { - width: 41.66667%; - } - .xxlarge-push-5 { - position: relative; - left: 41.66667%; - } - .xxlarge-pull-5 { - position: relative; - left: -41.66667%; - } - .xxlarge-offset-4 { - margin-left: 33.33333%; - } - .xxlarge-6 { - width: 50%; - } - .xxlarge-push-6 { - position: relative; - left: 50%; - } - .xxlarge-pull-6 { - position: relative; - left: -50%; - } - .xxlarge-offset-5 { - margin-left: 41.66667%; - } - .xxlarge-7 { - width: 58.33333%; - } - .xxlarge-push-7 { - position: relative; - left: 58.33333%; - } - .xxlarge-pull-7 { - position: relative; - left: -58.33333%; - } - .xxlarge-offset-6 { - margin-left: 50%; - } - .xxlarge-8 { - width: 66.66667%; - } - .xxlarge-push-8 { - position: relative; - left: 66.66667%; - } - .xxlarge-pull-8 { - position: relative; - left: -66.66667%; - } - .xxlarge-offset-7 { - margin-left: 58.33333%; - } - .xxlarge-9 { - width: 75%; - } - .xxlarge-push-9 { - position: relative; - left: 75%; - } - .xxlarge-pull-9 { - position: relative; - left: -75%; - } - .xxlarge-offset-8 { - margin-left: 66.66667%; - } - .xxlarge-10 { - width: 83.33333%; - } - .xxlarge-push-10 { - position: relative; - left: 83.33333%; - } - .xxlarge-pull-10 { - position: relative; - left: -83.33333%; - } - .xxlarge-offset-9 { - margin-left: 75%; - } - .xxlarge-11 { - width: 91.66667%; - } - .xxlarge-push-11 { - position: relative; - left: 91.66667%; - } - .xxlarge-pull-11 { - position: relative; - left: -91.66667%; - } - .xxlarge-offset-10 { - margin-left: 83.33333%; - } - .xxlarge-12 { - width: 100%; - } - .xxlarge-offset-11 { - margin-left: 91.66667%; - } - .xxlarge-up-1 > .column,.xxlarge-up-1 > .columns { - width: 100%; - float: left; - } - .xxlarge-up-1 > .column:nth-of-type(1n),.xxlarge-up-1 > .columns:nth-of-type(1n) { - clear: none; - } - .xxlarge-up-1 > .column:nth-of-type(1n+1),.xxlarge-up-1 > .columns:nth-of-type(1n+1) { - clear: both; - } - .xxlarge-up-1 > .column:last-child,.xxlarge-up-1 > .columns:last-child { - float: left; - } - .xxlarge-up-2 > .column,.xxlarge-up-2 > .columns { - width: 50%; - float: left; - } - .xxlarge-up-2 > .column:nth-of-type(1n),.xxlarge-up-2 > .columns:nth-of-type(1n) { - clear: none; - } - .xxlarge-up-2 > .column:nth-of-type(2n+1),.xxlarge-up-2 > .columns:nth-of-type(2n+1) { - clear: both; - } - .xxlarge-up-2 > .column:last-child,.xxlarge-up-2 > .columns:last-child { - float: left; - } - .xxlarge-up-3 > .column,.xxlarge-up-3 > .columns { - width: 33.33333%; - float: left; - } - .xxlarge-up-3 > .column:nth-of-type(1n),.xxlarge-up-3 > .columns:nth-of-type(1n) { - clear: none; - } - .xxlarge-up-3 > .column:nth-of-type(3n+1),.xxlarge-up-3 > .columns:nth-of-type(3n+1) { - clear: both; - } - .xxlarge-up-3 > .column:last-child,.xxlarge-up-3 > .columns:last-child { - float: left; - } - .xxlarge-up-4 > .column,.xxlarge-up-4 > .columns { - width: 25%; - float: left; - } - .xxlarge-up-4 > .column:nth-of-type(1n),.xxlarge-up-4 > .columns:nth-of-type(1n) { - clear: none; - } - .xxlarge-up-4 > .column:nth-of-type(4n+1),.xxlarge-up-4 > .columns:nth-of-type(4n+1) { - clear: both; - } - .xxlarge-up-4 > .column:last-child,.xxlarge-up-4 > .columns:last-child { - float: left; - } - .xxlarge-up-5 > .column,.xxlarge-up-5 > .columns { - width: 20%; - float: left; - } - .xxlarge-up-5 > .column:nth-of-type(1n),.xxlarge-up-5 > .columns:nth-of-type(1n) { - clear: none; - } - .xxlarge-up-5 > .column:nth-of-type(5n+1),.xxlarge-up-5 > .columns:nth-of-type(5n+1) { - clear: both; - } - .xxlarge-up-5 > .column:last-child,.xxlarge-up-5 > .columns:last-child { - float: left; - } - .xxlarge-up-6 > .column,.xxlarge-up-6 > .columns { - width: 16.66667%; - float: left; - } - .xxlarge-up-6 > .column:nth-of-type(1n),.xxlarge-up-6 > .columns:nth-of-type(1n) { - clear: none; - } - .xxlarge-up-6 > .column:nth-of-type(6n+1),.xxlarge-up-6 > .columns:nth-of-type(6n+1) { - clear: both; - } - .xxlarge-up-6 > .column:last-child,.xxlarge-up-6 > .columns:last-child { - float: left; - } - .xxlarge-up-7 > .column,.xxlarge-up-7 > .columns { - width: 14.28571%; - float: left; - } - .xxlarge-up-7 > .column:nth-of-type(1n),.xxlarge-up-7 > .columns:nth-of-type(1n) { - clear: none; - } - .xxlarge-up-7 > .column:nth-of-type(7n+1),.xxlarge-up-7 > .columns:nth-of-type(7n+1) { - clear: both; - } - .xxlarge-up-7 > .column:last-child,.xxlarge-up-7 > .columns:last-child { - float: left; - } - .xxlarge-up-8 > .column,.xxlarge-up-8 > .columns { - width: 12.5%; - float: left; - } - .xxlarge-up-8 > .column:nth-of-type(1n),.xxlarge-up-8 > .columns:nth-of-type(1n) { - clear: none; - } - .xxlarge-up-8 > .column:nth-of-type(8n+1),.xxlarge-up-8 > .columns:nth-of-type(8n+1) { - clear: both; - } - .xxlarge-up-8 > .column:last-child,.xxlarge-up-8 > .columns:last-child { - float: left; - } - .xxlarge-collapse > .column,.xxlarge-collapse > .columns { - padding-left: 0; - padding-right: 0; - } - .xxlarge-collapse .row { - margin-left: 0; - margin-right: 0; - } - .xxlarge-uncollapse > .column,.xxlarge-uncollapse > .columns { - padding-left: 0.9375rem; - padding-right: 0.9375rem; - } - .xxlarge-centered { - float: none; - margin-left: auto; - margin-right: auto; - } - .xxlarge-uncentered,.xxlarge-push-0,.xxlarge-pull-0 { - position: static; - margin-left: 0; - margin-right: 0; - float: left; - } -} - - -@media screen and (min-width: 40em) { - - .medium-text-left { - text-align: left; - } - .medium-text-right { - text-align: right; - } - .medium-text-center { - text-align: center; - } - .medium-text-justify { - text-align: justify; - } -} - - -@media screen and (min-width: 64em) { - - .large-text-left { - text-align: left; - } - .large-text-right { - text-align: right; - } - .large-text-center { - text-align: center; - } - .large-text-justify { - text-align: justify; - } -} - - -@media screen and (min-width: 75em) { - - .xlarge-text-left { - text-align: left; - } - .xlarge-text-right { - text-align: right; - } - .xlarge-text-center { - text-align: center; - } - .xlarge-text-justify { - text-align: justify; - } -} - - -@media screen and (min-width: 90em) { - - .xxlarge-text-left { - text-align: left; - } - .xxlarge-text-right { - text-align: right; - } - .xxlarge-text-center { - text-align: center; - } - .xxlarge-text-justify { - text-align: justify; - } -} - - -@media print { - - * { - background: transparent !important; - color: black !important; - box-shadow: none !important; - text-shadow: none !important; - } - .show-for-print { - display: block !important; - } - .hide-for-print { - display: none !important; - } - table.show-for-print { - display: table !important; - } - thead.show-for-print { - display: table-header-group !important; - } - tbody.show-for-print { - display: table-row-group !important; - } - tr.show-for-print { - display: table-row !important; - } - td.show-for-print { - display: table-cell !important; - } - th.show-for-print { - display: table-cell !important; - } - a,a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - .ir a:after,a[href^='javascript:']:after,a[href^='#']:after { - content: ''; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - pre,blockquote { - border: 1px solid #414042; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr,img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 0.5cm; - } - p,h2,h3 { - orphans: 3; - widows: 3; - } - h2,h3 { - page-break-after: avoid; - } -} - - -@media screen and (min-width: 0\0) { - - select { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg=="); - } -} - - -@media screen and (min-width: 40em) { - - .button-group.stacked-for-small .button { - width: auto; - } - .button-group.stacked-for-small .button:not(:last-child) { - margin-right: 1px; - } -} - - -@media screen and (min-width: 64em) { - - .button-group.stacked-for-medium .button { - width: auto; - } - .button-group.stacked-for-medium .button:not(:last-child) { - margin-right: 1px; - } -} - - -@media screen and (max-width: 39.9375em) { - - .button-group.stacked-for-small.expanded { - display: block; - } - .button-group.stacked-for-small.expanded .button { - display: block; - margin-right: 0; - } -} - - -@media screen and (min-width: 40em) { - - .menu.medium-horizontal > li { - display: table-cell; - } - .menu.medium-vertical > li { - display: block; - } -} - - -@media screen and (min-width: 64em) { - - .menu.large-horizontal > li { - display: table-cell; - } - .menu.large-vertical > li { - display: block; - } -} - - -@media screen and (min-width: 75em) { - - .menu.xlarge-horizontal > li { - display: table-cell; - } - .menu.xlarge-vertical > li { - display: block; - } -} - - -@media screen and (min-width: 90em) { - - .menu.xxlarge-horizontal > li { - display: table-cell; - } - .menu.xxlarge-vertical > li { - display: block; - } -} - - -@media screen and (min-width: 40em) { - - .dropdown.menu.medium-horizontal > li.opens-left > .is-dropdown-submenu { - left: auto; - right: 0; - top: 100%; - } - .dropdown.menu.medium-horizontal > li.opens-right > .is-dropdown-submenu { - right: auto; - left: 0; - top: 100%; - } - .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a { - padding-right: 1.5rem; - position: relative; - } - .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: #7cad2a transparent transparent; - border-top-style: solid; - border-bottom-width: 0; - right: 5px; - margin-top: -2px; - } - .dropdown.menu.medium-vertical > li .is-dropdown-submenu { - top: 0; - } - .dropdown.menu.medium-vertical > li.opens-left .is-dropdown-submenu { - left: auto; - right: 100%; - } - .dropdown.menu.medium-vertical > li.opens-right .is-dropdown-submenu { - right: auto; - left: 100%; - } - .dropdown.menu.medium-vertical > li > a::after { - right: 14px; - margin-top: -3px; - } - .dropdown.menu.medium-vertical > li.opens-left > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent #7cad2a transparent transparent; - border-right-style: solid; - border-left-width: 0; - } - .dropdown.menu.medium-vertical > li.opens-right > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent transparent transparent #7cad2a; - border-left-style: solid; - border-right-width: 0; - } -} - - -@media screen and (min-width: 64em) { - - .dropdown.menu.large-horizontal > li.opens-left > .is-dropdown-submenu { - left: auto; - right: 0; - top: 100%; - } - .dropdown.menu.large-horizontal > li.opens-right > .is-dropdown-submenu { - right: auto; - left: 0; - top: 100%; - } - .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a { - padding-right: 1.5rem; - position: relative; - } - .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: #7cad2a transparent transparent; - border-top-style: solid; - border-bottom-width: 0; - right: 5px; - margin-top: -2px; - } - .dropdown.menu.large-vertical > li .is-dropdown-submenu { - top: 0; - } - .dropdown.menu.large-vertical > li.opens-left .is-dropdown-submenu { - left: auto; - right: 100%; - } - .dropdown.menu.large-vertical > li.opens-right .is-dropdown-submenu { - right: auto; - left: 100%; - } - .dropdown.menu.large-vertical > li > a::after { - right: 14px; - margin-top: -3px; - } - .dropdown.menu.large-vertical > li.opens-left > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent #7cad2a transparent transparent; - border-right-style: solid; - border-left-width: 0; - } - .dropdown.menu.large-vertical > li.opens-right > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent transparent transparent #7cad2a; - border-left-style: solid; - border-right-width: 0; - } -} - - -@media screen and (min-width: 75em) { - - .dropdown.menu.xlarge-horizontal > li.opens-left > .is-dropdown-submenu { - left: auto; - right: 0; - top: 100%; - } - .dropdown.menu.xlarge-horizontal > li.opens-right > .is-dropdown-submenu { - right: auto; - left: 0; - top: 100%; - } - .dropdown.menu.xlarge-horizontal > li.is-dropdown-submenu-parent > a { - padding-right: 1.5rem; - position: relative; - } - .dropdown.menu.xlarge-horizontal > li.is-dropdown-submenu-parent > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: #7cad2a transparent transparent; - border-top-style: solid; - border-bottom-width: 0; - right: 5px; - margin-top: -2px; - } - .dropdown.menu.xlarge-vertical > li .is-dropdown-submenu { - top: 0; - } - .dropdown.menu.xlarge-vertical > li.opens-left .is-dropdown-submenu { - left: auto; - right: 100%; - } - .dropdown.menu.xlarge-vertical > li.opens-right .is-dropdown-submenu { - right: auto; - left: 100%; - } - .dropdown.menu.xlarge-vertical > li > a::after { - right: 14px; - margin-top: -3px; - } - .dropdown.menu.xlarge-vertical > li.opens-left > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent #7cad2a transparent transparent; - border-right-style: solid; - border-left-width: 0; - } - .dropdown.menu.xlarge-vertical > li.opens-right > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent transparent transparent #7cad2a; - border-left-style: solid; - border-right-width: 0; - } -} - - -@media screen and (min-width: 90em) { - - .dropdown.menu.xxlarge-horizontal > li.opens-left > .is-dropdown-submenu { - left: auto; - right: 0; - top: 100%; - } - .dropdown.menu.xxlarge-horizontal > li.opens-right > .is-dropdown-submenu { - right: auto; - left: 0; - top: 100%; - } - .dropdown.menu.xxlarge-horizontal > li.is-dropdown-submenu-parent > a { - padding-right: 1.5rem; - position: relative; - } - .dropdown.menu.xxlarge-horizontal > li.is-dropdown-submenu-parent > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: #7cad2a transparent transparent; - border-top-style: solid; - border-bottom-width: 0; - right: 5px; - margin-top: -2px; - } - .dropdown.menu.xxlarge-vertical > li .is-dropdown-submenu { - top: 0; - } - .dropdown.menu.xxlarge-vertical > li.opens-left .is-dropdown-submenu { - left: auto; - right: 100%; - } - .dropdown.menu.xxlarge-vertical > li.opens-right .is-dropdown-submenu { - right: auto; - left: 100%; - } - .dropdown.menu.xxlarge-vertical > li > a::after { - right: 14px; - margin-top: -3px; - } - .dropdown.menu.xxlarge-vertical > li.opens-left > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent #7cad2a transparent transparent; - border-right-style: solid; - border-left-width: 0; - } - .dropdown.menu.xxlarge-vertical > li.opens-right > a::after { - content: ''; - display: block; - width: 0; - height: 0; - border: inset 5px; - border-color: transparent transparent transparent #7cad2a; - border-left-style: solid; - border-right-width: 0; - } -} - - -@media screen and (max-width: 39.9375em) { - - .media-object.stack-for-small .media-object-section { - padding: 0; - padding-bottom: 1rem; - display: block; - } - .media-object.stack-for-small .media-object-section img { - width: 100%; - } -} - - -@media screen and (min-width: 40em) { - - .position-left.reveal-for-medium { - left: 0; - z-index: auto; - position: fixed; - } - .position-left.reveal-for-medium ~ .off-canvas-content { - margin-left: 250px; - } - .position-right.reveal-for-medium { - right: 0; - z-index: auto; - position: fixed; - } - .position-right.reveal-for-medium ~ .off-canvas-content { - margin-right: 250px; - } -} - - -@media screen and (min-width: 64em) { - - .position-left.reveal-for-large { - left: 0; - z-index: auto; - position: fixed; - } - .position-left.reveal-for-large ~ .off-canvas-content { - margin-left: 250px; - } - .position-right.reveal-for-large { - right: 0; - z-index: auto; - position: fixed; - } - .position-right.reveal-for-large ~ .off-canvas-content { - margin-right: 250px; - } -} - - -@media screen and (min-width: 75em) { - - .position-left.reveal-for-xlarge { - left: 0; - z-index: auto; - position: fixed; - } - .position-left.reveal-for-xlarge ~ .off-canvas-content { - margin-left: 250px; - } - .position-right.reveal-for-xlarge { - right: 0; - z-index: auto; - position: fixed; - } - .position-right.reveal-for-xlarge ~ .off-canvas-content { - margin-right: 250px; - } -} - - -@media screen and (min-width: 90em) { - - .position-left.reveal-for-xxlarge { - left: 0; - z-index: auto; - position: fixed; - } - .position-left.reveal-for-xxlarge ~ .off-canvas-content { - margin-left: 250px; - } - .position-right.reveal-for-xxlarge { - right: 0; - z-index: auto; - position: fixed; - } - .position-right.reveal-for-xxlarge ~ .off-canvas-content { - margin-right: 250px; - } -} - - -@media screen and (min-width: 40em) { - - .pagination li { - display: inline-block; - } -} - - -@media screen and (min-width: 40em) { - - .reveal { - min-height: 0; - } -} - - -@media screen and (min-width: 40em) { - - .reveal { - width: 600px; - max-width: 75rem; - } -} - - -@media screen and (min-width: 40em) { - - .reveal .reveal { - left: auto; - right: auto; - margin: 0 auto; - } -} - - -@media screen and (min-width: 40em) { - - .reveal.tiny { - width: 30%; - max-width: 75rem; - } -} - - -@media screen and (min-width: 40em) { - - .reveal.small { - width: 50%; - max-width: 75rem; - } -} - - -@media screen and (min-width: 40em) { - - .reveal.large { - width: 90%; - max-width: 75rem; - } -} - - -@media screen and (max-width: 39.9375em) { - - .reveal { - top: 0; - left: 0; - width: 100%; - height: 100%; - height: 100vh; - min-height: 100vh; - max-width: none; - margin-left: 0; - border: 0; - border-radius: 0; - } -} - - -@media screen and (max-width: 63.9375em) { - - table.stack thead { - display: none; - } - table.stack tfoot { - display: none; - } - table.stack tr,table.stack th,table.stack td { - display: block; - } - table.stack td { - border-top: 0; - } -} - - -@media screen and (min-width: 40em) { - - .top-bar .top-bar-left,.top-bar .top-bar-right { - width: auto; - } -} - - -@media screen and (max-width: 63.9375em) { - - .top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right { - width: 100%; - } -} - - -@media screen and (max-width: 74.9375em) { - - .top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right { - width: 100%; - } -} - - -@media screen and (max-width: 89.9375em) { - - .top-bar.stacked-for-xlarge .top-bar-left,.top-bar.stacked-for-xlarge .top-bar-right { - width: 100%; - } -} - - -@media screen and (max-width: 39.9375em) { - - .hide-for-small-only { - display: none !important; - } -} - - -@media screen and (max-width: 0em), screen and (min-width: 40em) { - - .show-for-small-only { - display: none !important; - } -} - - -@media screen and (min-width: 40em) { - - .hide-for-medium { - display: none !important; - } -} - - -@media screen and (max-width: 39.9375em) { - - .show-for-medium { - display: none !important; - } -} - - -@media screen and (min-width: 40em) and (max-width: 63.9375em) { - - .hide-for-medium-only { - display: none !important; - } -} - - -@media screen and (max-width: 39.9375em), screen and (min-width: 64em) { - - .show-for-medium-only { - display: none !important; - } -} - - -@media screen and (min-width: 64em) { - - .hide-for-large { - display: none !important; - } -} - - -@media screen and (max-width: 63.9375em) { - - .show-for-large { - display: none !important; - } -} - - -@media screen and (min-width: 64em) and (max-width: 74.9375em) { - - .hide-for-large-only { - display: none !important; - } -} - - -@media screen and (max-width: 63.9375em), screen and (min-width: 75em) { - - .show-for-large-only { - display: none !important; - } -} - - -@media screen and (min-width: 75em) { - - .hide-for-xlarge { - display: none !important; - } -} - - -@media screen and (max-width: 74.9375em) { - - .show-for-xlarge { - display: none !important; - } -} - - -@media screen and (min-width: 75em) and (max-width: 89.9375em) { - - .hide-for-xlarge-only { - display: none !important; - } -} - - -@media screen and (max-width: 74.9375em), screen and (min-width: 90em) { - - .show-for-xlarge-only { - display: none !important; - } -} - - -@media screen and (min-width: 90em) { - - .hide-for-xxlarge { - display: none !important; - } -} - - -@media screen and (max-width: 89.9375em) { - - .show-for-xxlarge { - display: none !important; - } -} - - -@media screen and (min-width: 90em) { - - .hide-for-xxlarge-only { - display: none !important; - } -} - - -@media screen and (max-width: 89.9375em) { - - .show-for-xxlarge-only { - display: none !important; - } -} - - -@media screen and (orientation: landscape) { - - .show-for-landscape,.hide-for-portrait { - display: block !important; - } -} - - -@media screen and (orientation: portrait) { - - .show-for-landscape,.hide-for-portrait { - display: none !important; - } -} - - -@media screen and (orientation: landscape) { - - .hide-for-landscape,.show-for-portrait { - display: none !important; - } -} - - -@media screen and (orientation: portrait) { - - .hide-for-landscape,.show-for-portrait { - display: block !important; - } -} - - -@keyframes shake-7 { - 0%,10%,20%,30%,40%,50%,60%,70%,80%,90% { - -webkit-transform: translateX(7%); - transform: translateX(7%); - } - 5%,15%,25%,35%,45%,55%,65%,75%,85%,95% { - -webkit-transform: translateX(-7%); - transform: translateX(-7%); - } -} - - -@keyframes shake-7 { - 0%,10%,20%,30%,40%,50%,60%,70%,80%,90% { - -webkit-transform: translateX(7%); - transform: translateX(7%); - } - 5%,15%,25%,35%,45%,55%,65%,75%,85%,95% { - -webkit-transform: translateX(-7%); - transform: translateX(-7%); - } -} - - -@keyframes spin-cw-1turn { - 0% { - -webkit-transform: rotate(-1turn); - transform: rotate(-1turn); - } - 100% { - -webkit-transform: rotate(0); - transform: rotate(0); - } -} - - -@keyframes spin-cw-1turn { - 0% { - -webkit-transform: rotate(-1turn); - transform: rotate(-1turn); - } - 100% { - -webkit-transform: rotate(0); - transform: rotate(0); - } -} - - -@keyframes spin-cw-1turn { - 0% { - -webkit-transform: rotate(0); - transform: rotate(0); - } - 100% { - -webkit-transform: rotate(1turn); - transform: rotate(1turn); - } -} - - -@keyframes wiggle-7deg { - 40%,50%,60% { - -webkit-transform: rotate(7deg); - transform: rotate(7deg); - } - 35%,45%,55%,65% { - -webkit-transform: rotate(-7deg); - transform: rotate(-7deg); - } - 0%,30%,70%,100% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} - - -@keyframes wiggle-7deg { - 40%,50%,60% { - -webkit-transform: rotate(7deg); - transform: rotate(7deg); - } - 35%,45%,55%,65% { - -webkit-transform: rotate(-7deg); - transform: rotate(-7deg); - } - 0%,30%,70%,100% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} - -#responsive-menu { - box-shadow: gray 0 0 20px; -} -.services-pos:nth-child(1) { - z-index: 50; -} -.services-pos:nth-child(2) { - z-index: 51; -} -.services-pos:nth-child(3) { - z-index: 52; -} -.services-pos:nth-child(4) { - z-index: 53; -} -.services-pos:nth-child(5) { - z-index: 54; -} -.services-pos:nth-child(6) { - z-index: 55; -} -.services-pos:nth-child(7) { - z-index: 56; -} -.services-pos:nth-child(8) { - z-index: 57; -} -.services-pos:nth-child(9) { - z-index: 58; -} -.services-pos:nth-child(10) { - z-index: 59; -} -.services-pos:nth-child(11) { - z-index: 60; -} -.services-pos:nth-child(12) { - z-index: 61; -} - - -@media only screen and (min-width: 90.063em) { - - .services-pos:nth-child(1) { - top: 0; - margin-top: 302px; - margin-left: 351px; - } - .services-pos:nth-child(2) { - top: 0; - margin-top: -217px; - margin-left: 489px; - } - .services-pos:nth-child(3) { - top: 0; - margin-top: -138px; - margin-left: 1037px; - } - .services-pos:nth-child(4) { - top: 0; - margin-top: -58px; - margin-left: 625px; - } - .services-pos:nth-child(5) { - top: 0; - margin-top: -138px; - margin-left: 900px; - } - .services-pos:nth-child(6) { - top: 0; - margin-top: -58px; - margin-left: 489px; - } - .services-pos:nth-child(7) { - top: 0; - margin-top: -138px; - margin-left: 762px; - } - .services-pos:nth-child(8) { - top: 0; - margin-top: -138px; - margin-left: 1037px; - } - .services-pos:nth-child(9) { - top: 0; - margin-top: -58px; - margin-left: 625px; - } - .services-pos:nth-child(10) { - top: 0; - margin-top: -138px; - margin-left: 900px; - } - .services-pos:nth-child(11) { - top: 0; - margin-top: -58px; - margin-left: 762px; - } - .services-pos:nth-child(12) { - top: 0; - margin-top: -58px; - margin-left: 900px; - } -} - - - -@media only screen and (min-width: 64.063em) and (max-width: 90em) { - - .services-pos:nth-child(1) { - top: 0; - margin-top: 143px; - margin-left: 76px; - } - .services-pos:nth-child(2) { - top: 0; - margin-top: -217px; - margin-left: 214px; - } - .services-pos:nth-child(3) { - top: 0; - margin-top: -138px; - margin-left: 762px; - } - .services-pos:nth-child(4) { - top: 0; - margin-top: -58px; - margin-left: 350px; - } - .services-pos:nth-child(5) { - top: 0; - margin-top: -138px; - margin-left: 625px; - } - .services-pos:nth-child(6) { - top: 0; - margin-top: -58px; - margin-left: 214px; - } - .services-pos:nth-child(7) { - top: 0; - margin-top: -138px; - margin-left: 487px; - } - .services-pos:nth-child(8) { - top: 0; - margin-top: -138px; - margin-left: 762px; - } - .services-pos:nth-child(9) { - top: 0; - margin-top: -58px; - margin-left: 350px; - } - .services-pos:nth-child(10) { - top: 0; - margin-top: -138px; - margin-left: 625px; - } - .services-pos:nth-child(11) { - top: 0; - margin-top: -58px; - margin-left: 487px; - } - .services-pos:nth-child(12) { - top: 0; - margin-top: -58px; - margin-left: 625px; - } -} - - - -@media only screen and (min-width: 40.063em) and (max-width: 64em) { - - .services-pos:nth-child(1) { - top: 0; - margin-top: 126px; - margin-left: 190px; - } - .services-pos:nth-child(2) { - top: 0; - margin-top: -217px; - margin-left: 328px; - } - .services-pos:nth-child(3) { - top: 313px; - margin-top: -138px; - margin-left: 328px; - } - .services-pos:nth-child(4) { - top: 0; - margin-top: -58px; - margin-left: 464px; - } - .services-pos:nth-child(5) { - top: -80px; - margin-top: -134px; - margin-left: 601px; - } - .services-pos:nth-child(6) { - top: 0; - margin-top: -58px; - margin-left: 328px; - } - .services-pos:nth-child(7) { - top: 0; - margin-top: -138px; - margin-left: 601px; - } - .services-pos:nth-child(8) { - top: 80px; - margin-top: -138px; - margin-left: 190px; - } - .services-pos:nth-child(9) { - top: 0; - margin-top: -58px; - margin-left: 464px; - } - .services-pos:nth-child(10) { - top: 160px; - margin-top: -138px; - margin-left: 190px; - } - .services-pos:nth-child(11) { - top: 0; - margin-top: -58px; - margin-left: 601px; - } - .services-pos:nth-child(12) { - top: 0; - margin-top: -58px; - margin-left: 464px; - } -} - - - -@media only screen and (max-width: 40em) { - - .outline-holder { - display: none; - } - .services-pos:nth-child(2) { - left: calc(50% - 150px); - } - .services-pos:nth-child(4) { - margin-top: 10px; - left: calc(50% - 150px); - } - .services-pos:nth-child(6) { - left: calc(50% - 15px); - margin-top: -210px; - } - .services-pos:nth-child(7) { - left: calc(50% - 15px); - margin-top: 10px; - } - .services-pos:nth-child(8) { - left: calc(50% - 150px); - margin-top: -65px; - } - .services-pos:nth-child(9) { - left: calc(50% - 15px); - margin-top: -60px; - } - .services-pos:nth-child(10) { - left: calc(50% - 15px); - margin-top: -65px; - } - .services-pos:nth-child(12) { - left: calc(50% - 150px); - margin-top: -60px; - } -} - - - -@media only screen and (max-width: 1270px) and (min-width: 64.063em) { - - .services-pos:nth-child(3) { - margin-top: -138px; - top: 313px; - margin-left: 214px; - } - .services-pos:nth-child(8) { - margin-top: -138px; - top: 80px; - margin-left: 76px; - } - .services-pos:nth-child(12) { - margin-left: 350px; - } -} - - -@media only screen and (min-width: 40.063em) and (max-width: 850px) { - - .services-pos:nth-child(5) { - margin-left: 53px; - } - .services-pos:nth-child(7) { - margin-left: 53px; - } - .services-pos:nth-child(11) { - margin-left: 53px; - } -} - - -@media (max-width: 1366px) { - - .row:not(.nochange) { - max-width: 60rem; - } -} - - -@media (max-width: 1270px) { - - .row:not(.nochange) { - max-width: 50rem; - } - h2,h5 { - text-align: center; - margin: auto; - } - .what-we-know-holder { - left: calc(50% - 650px / 2); - } -} - - -@media (max-width: 1100px) { - - .row:not(.nochange) { - max-width: 40rem; - } -} - - -@media (min-width: 1024px) { - - .medium-centered { - float: none; - display: block; - margin-left: 0; - margin-right: 0; - } -} - - -@media (max-width: 1023px) { - - .row:not(.nochange) { - max-width: 50rem; - } - .off-canvas-content { - padding-top: 0; - } - .item-data { - padding: 15px; - } - .item-data h4::after { - top: 60px; - } - .item-data a.button { - margin-top: 10px; - } - .ref-scr { - padding-left: 0.3rem; - padding-right: 0.3rem; - } - .detail-info { - padding-left: 1.5rem !important; - padding-right: 1.5rem !important; - } - .detail-buttons { - text-align: center; - } - .pull-right-for-small { - float: right; - } - [type="text"],[type="password"],[type="date"],[type="datetime"],[type="datetime-local"],[type="month"],[type="week"],[type="email"],[type="number"],[type="search"],[type="tel"],[type="time"],[type="url"],[type="color"],textarea,[type="text"]:focus,[type="password"]:focus,[type="date"]:focus,[type="datetime"]:focus,[type="datetime-local"]:focus,[type="month"]:focus,[type="week"]:focus,[type="email"]:focus,[type="number"]:focus,[type="search"]:focus,[type="tel"]:focus,[type="time"]:focus,[type="url"]:focus,[type="color"]:focus,textarea:focus { - margin-bottom: 0.4rem; - } - .button-medium-centered { - margin: auto; - text-align: center; - display: block; - } - .member-list { - margin-top: 25px; - border-right: 0; - } - .contact-address,.members { - float: left; - width: 50%; - } - .contact-address .small-8 { - text-align: right; - padding-top: 30px; - padding-bottom: 30px; - } - .members { - margin-top: 0; - } - .off-canvas { - background-color: rgba(88, 89, 91, 0.95); - } - #responsive-menu .main-menu { - text-align: center; - } - .off-canvas#responsive-menu .main-menu.menu > li > a { - font-size: 1.7rem; - } - .off-canvas#responsive-menu .main-menu.menu > li > a:hover,.off-canvas#responsive-menu .main-menu.menu > li.active > a { - color: #7cad2a; - } - .off-canvas#responsive-menu .main-menu.menu > li.active > a { - font-size: 2.2rem; - } -} - - -@media (max-width: 850px) { - - .row:not(.nochange) { - max-width: 45rem; - } - .item-data { - padding: 5px; - font-size: 0.8rem; - } - .item-data h4 { - margin-top: 5px; - margin-bottom: 5px; - } - .item-data h4::after { - top: 35px; - } - .item-data a.button { - margin-top: 10px; - } - .item-data p { - line-height: 1.2; - } -} - - -@media (max-width: 750px) { - - .row:not(.nochange) { - max-width: 40rem; - } -} - - -@media (max-width: 639px) { - - .row:not(.nochange) { - max-width: 30rem; - } - .ref-scr { - margin-bottom: 0; - } - .detail-info { - margin-top: 15px; - } - .item-data p,.item-data a,.item-data h4 { - color: #ffffff; - } - .item-data h4 { - font-size: 1rem; - margin-top: 20px; - display: block; - margin-bottom: 15px; - } - .item-data h4:after { - content: ''; - width: 10%; - height: 1px; - background-color: #fefefe; - display: inline-block; - position: absolute; - top: 50px; - left: 45%; - } - .item-data a { - text-transform: uppercase; - } -} - - -@media (max-width: 530px) { - - .row:not(.nochange) { - padding-left: 20px; - padding-right: 20px; - } - .detail-buttons .m-l-25 { - margin-left: 0; - } -} - - -@media (max-width: 500px) { - - .item-data h4:after { - display: none; - } - .item-data h4 { - margin-top: 10px; - margin-bottom: 5px; - } - .item-data p { - display: none; - } - .item-data a.button { - margin-top: 0; - } - .contact-address .small-4 { - display: none; - } - .contact-address,.members,.contact-address .small-8 { - float: left; - width: 100%; - } - .contact-address .small-8 { - text-align: center; - } - .members { - margin-top: 25px; - } - .what-we-know-holder { - left: 0; - height: 152px; - } - .what-we-know:nth-child(2) { - left: 70px; - } - .what-we-know:nth-child(3) { - left: 140px; - } - .what-we-know:nth-child(4) { - left: 210px; - } - .what-we-know:nth-child(5) { - left: 280px; - } - .what-we-know:nth-child(6) { - left: 0; - top: 76px; - } - .what-we-know:nth-child(7) { - left: 70px; - top: 114px; - } - .what-we-know:nth-child(8) { - left: 140px; - top: 76px; - } - .what-we-know:nth-child(9) { - left: 210px; - top: 114px; - } -} - - -@media (max-width: 400px) { - .title-bar-title img { - width: 100px; - height: auto; - margin-top: 17px; - } - a#responsive-menu-button { - font-size: 1rem; - } - .off-canvas#responsive-menu .main-menu.menu > li > a { - font-size: 1.3rem; - } - .off-canvas#responsive-menu .main-menu.menu > li.active > a { - font-size: 1.6rem; - } -} - - - -.article-list-item .date.big { - font-size: 5em; - line-height: 1em; - font-weight: 500; - color: #414042; -} -.article-list-item .date.month { - top: -15px; - position: relative; - right: 3px; - color: #414042; -} - -.gravatar { - border-radius: 50%; -} -.author .gravatar { - width: 40px; -} - -.article-list-item .author { - line-height: 1; - /*text-align: center;*/ -} - - -.article-list-item article { - padding: 0 15px 0 0; -} - -.article-list-item footer { - font-weight: bold; font-size: 120%; - padding: 0; - padding-right: 15px; -} - -article h1 { - font-size: 1.9em; - font-weight: 700; -} -article h2 { - margin-top: 20px; - font-size: 1.35em; - color: #414042; -} - -article h3 { - margin-top: 20px; - font-size: 1.15em; - color: #414042; -} - -.off-canvas-content .article-list-item div { - color: #414042; -} - -.comment aside { - line-height: 1; -} - -.comments-form textarea { - margin-bottom: 3px; -} -.comments-form .gravatar { - width: 50px; - float: right; - padding: 0; - margin: 0; -} \ No newline at end of file diff --git a/templates/Binarity/Resources/assets/images/avatar_kristyna.png b/templates/Binarity/Resources/assets/images/avatar_kristyna.png deleted file mode 100644 index 2b1f0e1e..00000000 Binary files a/templates/Binarity/Resources/assets/images/avatar_kristyna.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/avatar_kristyna_hexa_75.png b/templates/Binarity/Resources/assets/images/avatar_kristyna_hexa_75.png deleted file mode 100644 index 9dd65a8b..00000000 Binary files a/templates/Binarity/Resources/assets/images/avatar_kristyna_hexa_75.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/avatar_kristyna_small.png b/templates/Binarity/Resources/assets/images/avatar_kristyna_small.png deleted file mode 100644 index 23cb91aa..00000000 Binary files a/templates/Binarity/Resources/assets/images/avatar_kristyna_small.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/avatar_michal.png b/templates/Binarity/Resources/assets/images/avatar_michal.png deleted file mode 100644 index e123b5fc..00000000 Binary files a/templates/Binarity/Resources/assets/images/avatar_michal.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/avatar_michal_hexa_75.png b/templates/Binarity/Resources/assets/images/avatar_michal_hexa_75.png deleted file mode 100644 index 04547aa0..00000000 Binary files a/templates/Binarity/Resources/assets/images/avatar_michal_hexa_75.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/avatar_michal_small.png b/templates/Binarity/Resources/assets/images/avatar_michal_small.png deleted file mode 100644 index 1afca666..00000000 Binary files a/templates/Binarity/Resources/assets/images/avatar_michal_small.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/avatar_peter.png b/templates/Binarity/Resources/assets/images/avatar_peter.png deleted file mode 100644 index 0bdc2f79..00000000 Binary files a/templates/Binarity/Resources/assets/images/avatar_peter.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/avatar_peter_hexa_75.png b/templates/Binarity/Resources/assets/images/avatar_peter_hexa_75.png deleted file mode 100644 index 59839a9a..00000000 Binary files a/templates/Binarity/Resources/assets/images/avatar_peter_hexa_75.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/avatar_peter_small.png b/templates/Binarity/Resources/assets/images/avatar_peter_small.png deleted file mode 100644 index ba70357e..00000000 Binary files a/templates/Binarity/Resources/assets/images/avatar_peter_small.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/backgorund-image.jpg b/templates/Binarity/Resources/assets/images/backgorund-image.jpg deleted file mode 100644 index daf4d4e4..00000000 Binary files a/templates/Binarity/Resources/assets/images/backgorund-image.jpg and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/binarity_logo_menu.png b/templates/Binarity/Resources/assets/images/binarity_logo_menu.png deleted file mode 100644 index 414bf4c5..00000000 Binary files a/templates/Binarity/Resources/assets/images/binarity_logo_menu.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/hexagon_green.png b/templates/Binarity/Resources/assets/images/hexagon_green.png deleted file mode 100644 index ab4866a7..00000000 Binary files a/templates/Binarity/Resources/assets/images/hexagon_green.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/hexagon_green_outline.png b/templates/Binarity/Resources/assets/images/hexagon_green_outline.png deleted file mode 100644 index 20bceabc..00000000 Binary files a/templates/Binarity/Resources/assets/images/hexagon_green_outline.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/hexagon_grey.png b/templates/Binarity/Resources/assets/images/hexagon_grey.png deleted file mode 100644 index 69d4a523..00000000 Binary files a/templates/Binarity/Resources/assets/images/hexagon_grey.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/hexagon_grey_outline.png b/templates/Binarity/Resources/assets/images/hexagon_grey_outline.png deleted file mode 100644 index 74d6edb2..00000000 Binary files a/templates/Binarity/Resources/assets/images/hexagon_grey_outline.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/menu_logo.png b/templates/Binarity/Resources/assets/images/menu_logo.png deleted file mode 100644 index 5752e5eb..00000000 Binary files a/templates/Binarity/Resources/assets/images/menu_logo.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/social-cover.png b/templates/Binarity/Resources/assets/images/social-cover.png deleted file mode 100644 index 599b985d..00000000 Binary files a/templates/Binarity/Resources/assets/images/social-cover.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/techno/angularjs.png b/templates/Binarity/Resources/assets/images/techno/angularjs.png deleted file mode 100644 index 4305f756..00000000 Binary files a/templates/Binarity/Resources/assets/images/techno/angularjs.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/techno/css3.png b/templates/Binarity/Resources/assets/images/techno/css3.png deleted file mode 100644 index 5924c20c..00000000 Binary files a/templates/Binarity/Resources/assets/images/techno/css3.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/techno/html5.png b/templates/Binarity/Resources/assets/images/techno/html5.png deleted file mode 100644 index b5acc1ff..00000000 Binary files a/templates/Binarity/Resources/assets/images/techno/html5.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/techno/javascript.png b/templates/Binarity/Resources/assets/images/techno/javascript.png deleted file mode 100644 index fac60681..00000000 Binary files a/templates/Binarity/Resources/assets/images/techno/javascript.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/techno/jquery.png b/templates/Binarity/Resources/assets/images/techno/jquery.png deleted file mode 100644 index ab9abb0d..00000000 Binary files a/templates/Binarity/Resources/assets/images/techno/jquery.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/techno/laravel.png b/templates/Binarity/Resources/assets/images/techno/laravel.png deleted file mode 100644 index d28e1190..00000000 Binary files a/templates/Binarity/Resources/assets/images/techno/laravel.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/techno/mysql.png b/templates/Binarity/Resources/assets/images/techno/mysql.png deleted file mode 100644 index fceaa27a..00000000 Binary files a/templates/Binarity/Resources/assets/images/techno/mysql.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/techno/nette.png b/templates/Binarity/Resources/assets/images/techno/nette.png deleted file mode 100644 index 2ca818a2..00000000 Binary files a/templates/Binarity/Resources/assets/images/techno/nette.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/techno/nodejs.png b/templates/Binarity/Resources/assets/images/techno/nodejs.png deleted file mode 100644 index a78ce3c0..00000000 Binary files a/templates/Binarity/Resources/assets/images/techno/nodejs.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/techno/phalcon.png b/templates/Binarity/Resources/assets/images/techno/phalcon.png deleted file mode 100644 index 9aef3a7a..00000000 Binary files a/templates/Binarity/Resources/assets/images/techno/phalcon.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/techno/php.png b/templates/Binarity/Resources/assets/images/techno/php.png deleted file mode 100644 index 4d33d051..00000000 Binary files a/templates/Binarity/Resources/assets/images/techno/php.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/techno/postgresql.png b/templates/Binarity/Resources/assets/images/techno/postgresql.png deleted file mode 100644 index 4105e6dc..00000000 Binary files a/templates/Binarity/Resources/assets/images/techno/postgresql.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/techno/sailsjs.png b/templates/Binarity/Resources/assets/images/techno/sailsjs.png deleted file mode 100644 index d6f15b87..00000000 Binary files a/templates/Binarity/Resources/assets/images/techno/sailsjs.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/images/technologies_hexagon.png b/templates/Binarity/Resources/assets/images/technologies_hexagon.png deleted file mode 100644 index d6539db3..00000000 Binary files a/templates/Binarity/Resources/assets/images/technologies_hexagon.png and /dev/null differ diff --git a/templates/Binarity/Resources/assets/js/BLightBox.js b/templates/Binarity/Resources/assets/js/BLightBox.js deleted file mode 100644 index 2357c2bf..00000000 --- a/templates/Binarity/Resources/assets/js/BLightBox.js +++ /dev/null @@ -1,289 +0,0 @@ -/** - * Lightbox library created by binarity s.r.o. - * www.binarity.cz - * version 1.0.0 - * - * Vanilla JavaScript lightbox plugin. - * - * Can use custom invoker passed as first argument or uses a default one - .b-lightbox. - * This allows to have more lightbox instances on one site to categorize items. - * - * Default behaviour: - * - Hides on escape keydown event - settable (options.allow_escape). - * - Hides on background click - settable (options.allow_backgroundclick). - * - Hide button in top right corner - settable (options.close_text). - * - Allows usage of arrow keys (left/right) to navigate through images - settable (option.allow_arrows). - * - * @param options - * @param autorun - * @constructor - */ -function BLightBox(options, autorun) { - // Instance and instance variables. - var BLightBox = this, - escape_key_allowed = (!(options !== undefined && options.allow_escape === false)), - hide_on_holder_allowed = (!(options !== undefined && options.allow_backgroundclick === false)), - arrows_allowed = (!(options !== undefined && options.allow_arrows === false)), - close_text = (options !== undefined && options.close_text !== undefined) ? options.close_text : 'Close', - - // DOM - lightbox_holder = document.createElement('div'), - invoker_string = (options !== undefined && options.invoker !== undefined) ? options.invoker : '.b-lightbox', - invokers = document.querySelectorAll(invoker_string), - invokers_length = invokers.length, - lightbox_image = document.createElement('img'), - close_label = document.createElement('a'), - previous_button = document.createElement('a'), - next_button = document.createElement('a'), - lightbox_label = document.createElement('span'); - - // BLightBox DOM default settings. - lightbox_holder.className = 'b-lightbox-holder'; - lightbox_image.className = 'b-lightbox-image'; - close_label.className = 'b-lightbox-close-button'; - close_label.textContent = close_text; - previous_button.className = 'b-lightbox-direction previous'; - previous_button.innerHTML = '‹'; - next_button.className = 'b-lightbox-direction next'; - next_button.innerHTML = '›'; - lightbox_label.className = 'b-lightbox-label'; - - /** - * Show new image according to data-newindex attribute on directional button - */ - this.loadNewImage = function(event) { - event.stopPropagation(); - var index = event.target.getAttribute('data-newindex'), - label = invokers[index].getAttribute('data-label'); - - if(invokers[index]) { - lightbox_image.style.display = 'none'; - this.decideFromLoad(invokers[index]); - lightbox_image.style.display = 'block'; - if(label != '') { - lightbox_label.innerHTML = label; - } - } - - this.lightboxImageCenter(label != ''); // Center image. - - // Change indexes to be opened. - previous_button.setAttribute('data-newindex', this.getPreviousIndex(index)); - next_button.setAttribute('data-newindex', this.getNextIndex(index)); - }; - - /** - * Returns first next index possible, or return very first index to allow rotation. - * @param index - * @returns {number} - */ - this.getNextIndex = function(index) { - // Skip to last image if we are on the first. - return (index == invokers_length - 1) ? 0 : parseInt(index) + 1; - }; - - /** - * Returns first previous index possible, or returns last array index to allow rotation. - * @param index - * @returns {number} - */ - this.getPreviousIndex = function(index) { - // Skip to last image if we are on the first. - return (index == 0) ? invokers_length - 1 : index - 1; - }; - - /** - * Reset ivokers_length variable for re-use. - */ - this.resetInvokersLength = function() { - invokers_length = invokers.length; - }; - - /** - * Provides code for closing a lightbox and hiding images. - */ - this.listenActionClose = function(event) { - lightbox_holder.style.display = 'none'; - lightbox_image.style.display = 'none'; - }; - - /** - * Adds src to lightbox image from element's style background-image. - * Removes url() par of the string. - * @param el - */ - this.loadImageFromBackgroundImage = function(el) { - lightbox_image.src = el.style.backgroundImage.replace(/url\("?(.*[^"])"?\)/, '$1'); - }; - - /** - * Adds src to lightbox image from element's child img tag. - * @param el - */ - this.loadImageFromChildImg = function(el) { - var img = el.querySelector('img'); - if(img) { - lightbox_image.src = img.src; - } - }; - - /** - * Move lightbox image to the center of screen. - */ - this.lightboxImageCenter = function(bool_label) { - // Image - lightbox_image.style.left = ((lightbox_holder.offsetWidth - lightbox_image.offsetWidth) / 2) + 'px'; - lightbox_image.style.top = ((lightbox_holder.offsetHeight - lightbox_image.offsetHeight) / 2) + 'px'; - - // Image label. - if(bool_label === true) { - lightbox_label.style.width = lightbox_image.offsetWidth + 'px'; - lightbox_label.style.left = ((lightbox_holder.offsetWidth - lightbox_image.offsetWidth) / 2) + 'px'; - lightbox_label.style.display = 'block'; - lightbox_label.style.top = (lightbox_image.offsetTop + lightbox_image.offsetHeight - lightbox_label.offsetHeight) + 'px'; - } - }; - - /** - * Returns index in invokers array or false on unsuccessful attempt to find the element. - * @param el - * @returns {*} - */ - this.getIndexInInvokers = function(el) { - var inv_length = invokers_length; - while(inv_length--) { - if(invokers[inv_length].isEqualNode(el)) { - return inv_length; - } - } - return false; - }; - - /** - * This method decides from where to load src attribute into lightbox_image. - * @param el - */ - this.decideFromLoad = function(el) { - // Decide from which source to get image url. - if(el.hasAttribute('data-background')) { - this.loadImageFromBackgroundImage(el); - } else if(el.hasAttribute('data-img')) { - this.loadImageFromChildImg(el); - } - - lightbox_label.style.display = 'none'; - lightbox_label.innerHTML = ''; - }; - - /** - * Provides code for opening a lightbox and displaying images. - */ - this.listenActionOpen = function(el, app, event) { - var label = el.getAttribute('data-label'); - - event.stopPropagation(); - event.preventDefault(); // If element is a-tag, prevent from href requesting. - - app.decideFromLoad(el); // Load image into lightbox_image. - - // Change indexes to be opened. - previous_button.setAttribute('data-newindex', app.getPreviousIndex(app.getIndexInInvokers(el))); - next_button.setAttribute('data-newindex', app.getNextIndex(app.getIndexInInvokers(el))); - - // Show lightbox and image. - lightbox_holder.style.display = 'block'; - lightbox_image.style.display = 'block'; - if(label != '') { - lightbox_label.innerHTML = label; - } - - // Center lightbox within the screen. - app.lightboxImageCenter(label != ''); - }; - - /** - * Add lightbox closing method listener to given element. - * @param el - */ - this.addCloseListenerFor = function(el) { - el.addEventListener('click', this.listenActionClose.bind(this)); - }; - - /** - * Add lightbox opening method listener to given element. - * @param el - */ - this.addOpenListenerFor = function(el) { - var app = this; - el.addEventListener('click', app.listenActionOpen.bind(app, el, this), true); - }; - - /** - * Initializes all possible listeners at once on class instance creation. - */ - this.initiateListeners = function() { - // Open Listeners. - while(invokers_length--) { - this.addOpenListenerFor(invokers[invokers_length]); - } - this.resetInvokersLength(); - - // Close Listeners. - // On background click. - if(hide_on_holder_allowed){ - this.addCloseListenerFor(lightbox_holder); - } - // On escape key hit, if requested. - if(escape_key_allowed) { - window.addEventListener('keydown', function (event) { - if(event.keyCode === 27) { - BLightBox.listenActionClose(); - } - }); - } - - // Directional buttons. - previous_button.addEventListener('click',this.loadNewImage.bind(this)); - next_button.addEventListener('click',this.loadNewImage.bind(this)); - // Allow directing with arrows when enabled. - if(arrows_allowed) { - window.addEventListener('keydown', function arrowDirections(event) { - if(event.keyCode === 37) { - previous_button.click(); - } else if(event.keyCode === 39) { - next_button.click(); - } - }); - } - }; - - /** - * Initialization method that starts BLightBox instance. - * @returns {*} - */ - this.init = function() { - // Append lightbox background. - document.body.appendChild(lightbox_holder); - lightbox_holder.appendChild(previous_button); - lightbox_holder.appendChild(lightbox_image); - lightbox_holder.appendChild(next_button); - lightbox_holder.appendChild(close_label); - lightbox_holder.appendChild(lightbox_label); - // Add event listeners for invokers. - this.initiateListeners(); - - // Auto centering on window.resize; - window.addEventListener('resize', function() { - BLightBox.lightboxImageCenter(true); - }); - - return BLightBox; - }; - - // If autorun is requested, create instance. - if(autorun !== undefined && autorun === true) { - return this.init(); - } else { - return this; - } -} \ No newline at end of file diff --git a/templates/Binarity/Resources/assets/js/app.js b/templates/Binarity/Resources/assets/js/app.js deleted file mode 100644 index 907cfbde..00000000 --- a/templates/Binarity/Resources/assets/js/app.js +++ /dev/null @@ -1,86 +0,0 @@ -$(document).foundation(); - -new CookiePolicy(); - -window.addEventListener('load', function() { - var lightbox = new BLightBox({ - invoker: '.b-invo', - close_text: 'Zavřít' - }, true); - - var gallery_links = document.querySelectorAll('.b-invo'), - gallery_links_i = gallery_links.length; -}); - -function switchResponsiveMenu() { - var menuHolder = document.getElementById('responsive-menu'); - if(menuHolder.style.width == "100%") { - hideResponsiveMenu(); - } else { - showResponsiveMenu(); - } -} - -function showResponsiveMenu() { - var menuHolder = document.getElementById('responsive-menu'), - titleBar = document.getElementsByClassName('title-bar')[0], - titleBarCS = window.getComputedStyle(titleBar); - menuHolder.style.display="block"; - menuHolder.style.height = document.documentElement.clientHeight + 'px'; - menuHolder.style.height = window.innerHeight + 'px'; - menuHolder.style.left = "0"; - menuHolder.style.width = "100%"; - menuHolder.style.zIndex = 1000; - menuHolder.style.top = titleBarCS.height; - menuHolder.style.height = '100%;'; - titleBar.style.position = 'fixed'; -} - -function hideResponsiveMenu() { - var menuHolder = document.getElementById('responsive-menu'), - titleBar = document.getElementsByClassName('title-bar')[0]; - menuHolder.style.display = "none"; - menuHolder.style.width = "250px"; - titleBar.style.position = 'initial'; - document.body.style.paddingTop = '0'; -} - -window.addEventListener('resize', function() { - var menuHolder = document.getElementById('responsive-menu'); - hideResponsiveMenu(); - if(window.innerWidth >= 1023) { - menuHolder.style.display="block"; - menuHolder.style.height = "auto"; - menuHolder.style.top = "0"; - } -}); - -var flippers = document.querySelectorAll ('.hover-on-start'), - flipi = flippers.length; - -while (flipi--) { - (function (flipi) { - setTimeout (function () { - flippers[flipi].classList.toggle ('hover'); - }, flipi * 200); - }) (flipi); -} - - -$('.flip-container.hover-on-start').bind('touchstart', function (e) { - e.preventDefault(); - $(this).toggleClass('hover'); -}); - -function showMoreReferences(evt) { - $ (evt).parent ().remove (); - $ ('.more-references').fadeIn (200); -} - -window.addEventListener ('load', function () { - $ ('.reference-item').mouseenter (function () { - $ (this).find ('.item-data').animate ({opacity: 1}, 300, 'swing'); - }).mouseleave (function () { - $ (this).find ('.item-data').animate ({opacity: 0}, 300, 'swing'); - }); -}); \ No newline at end of file diff --git a/templates/Binarity/Resources/assets/js/cookies.js b/templates/Binarity/Resources/assets/js/cookies.js deleted file mode 100644 index 59441f88..00000000 --- a/templates/Binarity/Resources/assets/js/cookies.js +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Cookie handling mini framework & - * EU Cookie policy information layer - * - * created by binarity s.r.o - * www.binarity.cz - * - * @returns {*} - * @constructor - */ -var Cookies = { - read: function(sKey) { - return !sKey ? null : decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null; - }, - set: function(sKey, sValue, vEnd, sPath, sDomain, bSecure) { - if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return false; } - var sExpires = ""; - if (vEnd) { - switch (vEnd.constructor) { - case Number: - sExpires = vEnd === Infinity ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT" : "; max-age=" + vEnd; - break; - case String: - sExpires = "; expires=" + vEnd; - break; - case Date: - sExpires = "; expires=" + vEnd.toUTCString(); - break; - } - } - document.cookie = encodeURIComponent(sKey) + "=" + encodeURIComponent(sValue) + sExpires + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "") + (bSecure ? "; secure" : ""); - return true; - }, - remove: function (sKey, sPath, sDomain) { - if (!this.has(sKey)) { return false; } - document.cookie = encodeURIComponent(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : ""); - return true; - }, - has: function (sKey) { - if (!sKey) { return false; } - return (new RegExp("(?:^|;\\s*)" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie); - }, - keys: function () { - var aKeys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "").split(/\s*(?:\=[^;]*)?;\s*/); - for (var nLen = aKeys.length, nIdx = 0; nIdx < nLen; nIdx++) { aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]); } - return aKeys; - } -}; - -function CookiePolicy(sPrefix, sText, sMore, sMoreURL, sUnderstand, sCookieName) { - 'use strict'; - - var prefix = sPrefix || 'bineucookie_', - cookieName = sCookieName || 'allowed_eu', - text = sText || 'Tyto webové stránky používají k poskytování služeb, personalizaci reklam a analýze návštěvnosti soubory cookie. Informace o tom, jak tyto webové stránky používáte, jsou sdíleny se společností Google. Používáním těchto webových stránek souhlasíte s použitím souborů cookie.', - more = sMore || 'Další informace', - more_url = sMoreURL || 'https://www.google.com/policies/technologies/cookies/', - understand = sUnderstand || 'Rozumím', - // DOM - layerHolder = document.createElement('div'), - textElement = document.createElement('p'), - moreInfoButton = document.createElement('a'), - okButton = document.createElement('a'); - - /** - * This method checks whether cookie about cookies was set or not. - * If it was set, this method additionally checks for its validity. - */ - this.isValidCookie = function(sKey) { - return Cookies.has(prefix + sKey); - }; - - /** - * This method just adds custom styles to page header so it does not need to be all inline/ - */ - this.addStyle = function() { - var styleElement = document.createElement('style'); - - styleElement.id = prefix + 'style'; - styleElement.innerHTML += '#bin_eu_cookie_layer {opacity:1; position:fixed; padding:16px; left:0; top:0; width:100%; display:block; color:#f4f4f4; background-color:rgba(0,0,0,0.8); z-index:1000;}\r\n'; - styleElement.innerHTML += '#bin_eu_cookie_layer #bin-cookie-text {width:80%; float:left; display:inline-block;}\r\n'; - styleElement.innerHTML += '#bin_eu_cookie_layer .bin-button {padding: 8px; float:right;}\r\n'; - - // Responsive version - styleElement.innerHTML += '@media screen and (max-width:980px) {\r\n'; - styleElement.innerHTML += '\t#bin_eu_cookie_layer #bin-cookie-text {width:100%;}'; - styleElement.innerHTML += '}\r\n'; - - document.head.appendChild(styleElement); - }; - - /** - * This method accepts eu cookie policy by setting up a cookie that will inform the script next time that the policy - * was already accepted. - */ - this.acceptCookiePolicy = function() { - var date = new Date(); - date.setFullYear(date.getFullYear() + 25); - Cookies.set(prefix + cookieName, 1, date.toGMTString(), '/'); - - layerHolder.parentNode.removeChild(layerHolder); - }; - - /** - * This method adds necessary elements to the DOM - */ - this.addElements = function() { - layerHolder.id = "bin_eu_cookie_layer"; - - textElement.id = "bin-cookie-text"; - textElement.textContent = text; - - moreInfoButton.className = 'bin-button'; - moreInfoButton.textContent = more; - moreInfoButton.href = more_url; - moreInfoButton.target = '_blank'; - - okButton.id = 'bin-cookie-ok'; - okButton.className = 'bin-button'; - okButton.textContent = understand; - okButton.href = 'javascript:void(0);'; - - layerHolder.appendChild(textElement); - layerHolder.appendChild(moreInfoButton); - layerHolder.appendChild(okButton); - - document.body.appendChild(layerHolder); - - okButton.addEventListener('click', this.acceptCookiePolicy); - }; - - /** - * Method for adding complete DOM layer to the DOM. - */ - this.addDOMLayer = function() { - this.addStyle(); - this.addElements(); - }; - - /** - * This method initializes the whole process of drawing eu cookie policy layer. - */ - this.init = function() { - if(!this.isValidCookie(cookieName)) { - this.addDOMLayer(); - } - }; - - return this.init(); // Auto-run on setup. -} \ No newline at end of file diff --git a/templates/Binarity/Resources/assets/js/foundation.min.js b/templates/Binarity/Resources/assets/js/foundation.min.js deleted file mode 100644 index 4f3d749a..00000000 --- a/templates/Binarity/Resources/assets/js/foundation.min.js +++ /dev/null @@ -1,3 +0,0 @@ -!function(t){"use strict";function e(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/,i=e.exec(t.toString());return i&&i.length>1?i[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function i(t){return/true/.test(t)?!0:/false/.test(t)?!1:isNaN(1*t)?t:parseFloat(t)}function n(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}var s="6.1.1",o={version:s,_plugins:{},_uuids:[],_activePlugins:{},rtl:function(){return"rtl"===t("html").attr("dir")},plugin:function(t,i){var s=i||e(t),o=n(s);this._plugins[o]=this[s]=t},registerPlugin:function(t,i){var s=i?n(i):e(t.constructor).toLowerCase();t.uuid=this.GetYoDigits(6,s),t.$element.attr("data-"+s)||t.$element.attr("data-"+s,t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf."+s),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var i=n(e(t.$element.data("zfPlugin").constructor));this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-"+i).removeData("zfPlugin").trigger("destroyed.zf."+i);for(var s in t)t[s]=null},reInit:function(e){var i=e instanceof t;try{if(i)e.each(function(){t(this).data("zfPlugin")._init()});else{var n=typeof e,s=this,o={object:function(e){e.forEach(function(e){t("[data-"+e+"]").foundation("_init")})},string:function(){t("[data-"+e+"]").foundation("_init")},undefined:function(){this.object(Object.keys(s._plugins))}};o[n](e)}}catch(a){console.error(a)}finally{return e}},GetYoDigits:function(t,e){return t=t||6,Math.round(Math.pow(36,t+1)-Math.random()*Math.pow(36,t)).toString(36).slice(1)+(e?"-"+e:"")},reflow:function(e,n){"undefined"==typeof n?n=Object.keys(this._plugins):"string"==typeof n&&(n=[n]);var s=this;t.each(n,function(n,o){var a=s._plugins[o],r=t(e).find("[data-"+o+"]").addBack("[data-"+o+"]");r.each(function(){var e=t(this),n={};if(e.data("zfPlugin"))return void console.warn("Tried to initialize "+o+" on an element that already has a Foundation plugin.");if(e.attr("data-options")){e.attr("data-options").split(";").forEach(function(t,e){var s=t.split(":").map(function(t){return t.trim()});s[0]&&(n[s[0]]=i(s[1]))})}try{e.data("zfPlugin",new a(t(this),n))}catch(s){console.error(s)}finally{return}})})},getFnName:e,transitionend:function(t){var e,i={transition:"transitionend",WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend"},n=document.createElement("div");for(var s in i)"undefined"!=typeof n.style[s]&&(e=i[s]);return e?e:(e=setTimeout(function(){t.triggerHandler("transitionend",[t])},1),"transitionend")}};o.util={throttle:function(t,e){var i=null;return function(){var n=this,s=arguments;null===i&&(i=setTimeout(function(){t.apply(n,s),i=null},e))}}};var a=function(i){var n=typeof i,s=t("meta.foundation-mq"),a=t(".no-js");if(s.length||t('').appendTo(document.head),a.length&&a.removeClass("no-js"),"undefined"===n)o.MediaQuery._init(),o.reflow(this);else{if("string"!==n)throw new TypeError("We're sorry, '"+n+"' is not a valid parameter. You must use a string representing the method you wish to invoke.");var r=Array.prototype.slice.call(arguments,1),l=this.data("zfPlugin");if(void 0===l||void 0===l[i])throw new ReferenceError("We're sorry, '"+i+"' is not an available method for "+(l?e(l):"this element")+".");1===this.length?l[i].apply(l,r):this.each(function(e,n){l[i].apply(t(n).data("zfPlugin"),r)})}return this};window.Foundation=o,t.fn.foundation=a,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e=h.offset.top,r=d.offset.left>=h.offset.left,l=d.offset.left+d.width<=h.width}else a=d.offset.top+d.height<=d.windowDims.height+d.windowDims.offset.top,o=d.offset.top>=d.windowDims.offset.top,r=d.offset.left>=d.windowDims.offset.left,l=d.offset.left+d.width<=d.windowDims.width;var u=[a,o,r,l];return i?r===l==!0:s?o===a==!0:-1===u.indexOf(!1)},n=function(t,i){if(t=t.length?t[0]:t,t===e||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var n=t.getBoundingClientRect(),s=t.parentNode.getBoundingClientRect(),o=document.body.getBoundingClientRect(),a=e.pageYOffset,r=e.pageXOffset;return{width:n.width,height:n.height,offset:{top:n.top+a,left:n.left+r},parentDims:{width:s.width,height:s.height,offset:{top:s.top+a,left:s.left+r}},windowDims:{width:o.width,height:o.height,offset:{top:a,left:r}}}},s=function(t,e,i,s,o,a){var r=n(t),l=e?n(e):null;switch(i){case"top":return{left:l.offset.left,top:l.offset.top-(r.height+s)};case"left":return{left:l.offset.left-(r.width+o),top:l.offset.top};case"right":return{left:l.offset.left+l.width+o,top:l.offset.top};case"center top":return{left:l.offset.left+l.width/2-r.width/2,top:l.offset.top-(r.height+s)};case"center bottom":return{left:a?o:l.offset.left+l.width/2-r.width/2,top:l.offset.top+l.height+s};case"center left":return{left:l.offset.left-(r.width+o),top:l.offset.top+l.height/2-r.height/2};case"center right":return{left:l.offset.left+l.width+o+1,top:l.offset.top+l.height/2-r.height/2};case"center":return{left:r.windowDims.offset.left+r.windowDims.width/2-r.width/2,top:r.windowDims.offset.top+r.windowDims.height/2-r.height/2};case"reveal":return{left:(r.windowDims.width-r.width)/2,top:r.windowDims.offset.top+s};case"reveal full":return{left:r.windowDims.offset.left,top:r.windowDims.offset.top};default:return{left:l.offset.left,top:l.offset.top+l.height+s}}};t.Box={ImNotTouchingYou:i,GetDimensions:n,GetOffsets:s}}(window.Foundation,window),!function(t,e){"use strict";e.Keyboard={};var i={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},n=function(t){var e={};for(var i in t)e[t[i]]=t[i];return e}(i);e.Keyboard.keys=n;var s=function(t){var e=i[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return t.shiftKey&&(e="SHIFT_"+e),t.ctrlKey&&(e="CTRL_"+e),t.altKey&&(e="ALT_"+e),e};e.Keyboard.parseKey=s;var o={},a=function(i,n,a){var r,l,d,h=o[n],u=s(i);return h?(r="undefined"==typeof h.ltr?h:e.rtl()?t.extend({},h.ltr,h.rtl):t.extend({},h.rtl,h.ltr),l=r[u],d=a[l],void(d&&"function"==typeof d?(d.apply(),(a.handled||"function"==typeof a.handled)&&a.handled.apply()):(a.unhandled||"function"==typeof a.unhandled)&&a.unhandled.apply())):console.warn("Component not defined!")};e.Keyboard.handleKey=a;var r=function(e){return e.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter(function(){return!t(this).is(":visible")||t(this).attr("tabindex")<0?!1:!0})};e.Keyboard.findFocusable=r;var l=function(t,e){o[t]=e};e.Keyboard.register=l}(jQuery,window.Foundation),!function(t,e){function i(t){var e={};return"string"!=typeof t?e:(t=t.trim().slice(1,-1))?e=t.split("&").reduce(function(t,e){var i=e.replace(/\+/g," ").split("="),n=i[0],s=i[1];return n=decodeURIComponent(n),s=void 0===s?null:decodeURIComponent(s),t.hasOwnProperty(n)?Array.isArray(t[n])?t[n].push(s):t[n]=[t[n],s]:t[n]=s,t},{}):e}var n={queries:[],current:"",atLeast:function(t){var e=this.get(t);return e?window.matchMedia(e).matches:!1},get:function(t){for(var e in this.queries){var i=this.queries[e];if(t===i.name)return i.value}return null},_init:function(){var e,n=this,s=t(".foundation-mq").css("font-family");e=i(s);for(var o in e)n.queries.push({name:o,value:"only screen and (min-width: "+e[o]+")"});this.current=this._getCurrentSize(),this._watcher()},_getCurrentSize:function(){var t;for(var e in this.queries){var i=this.queries[e];window.matchMedia(i.value).matches&&(t=i)}return"object"==typeof t?t.name:t},_watcher:function(){var e=this;t(window).on("resize.zf.mediaquery",function(){var i=e._getCurrentSize();i!==e.current&&(t(window).trigger("changed.zf.mediaquery",[i,e.current]),e.current=i)})}};e.MediaQuery=n,window.matchMedia||(window.matchMedia=function(){"use strict";var t=window.styleMedia||window.media;if(!t){var e=document.createElement("style"),i=document.getElementsByTagName("script")[0],n=null;e.type="text/css",e.id="matchmediajs-test",i.parentNode.insertBefore(e,i),n="getComputedStyle"in window&&window.getComputedStyle(e,null)||e.currentStyle,t={matchMedium:function(t){var i="@media "+t+"{ #matchmediajs-test { width: 1px; } }";return e.styleSheet?e.styleSheet.cssText=i:e.textContent=i,"1px"===n.width}}}return function(e){return{matches:t.matchMedium(e||"all"),media:e||"all"}}}())}(jQuery,Foundation),!function(t,e){function i(i,o,a,r){function l(){i||o.hide(),d(),r&&r.apply(o)}function d(){o[0].style.transitionDuration=0,o.removeClass(h+" "+u+" "+a)}if(o=t(o).eq(0),o.length){var h=i?n[0]:n[1],u=i?s[0]:s[1];d(),o.addClass(a).css("transition","none"),requestAnimationFrame(function(){o.addClass(h),i&&o.show()}),requestAnimationFrame(function(){o[0].offsetWidth,o.css("transition",""),o.addClass(u)}),o.one(e.transitionend(o),l)}}var n=["mui-enter","mui-leave"],s=["mui-enter-active","mui-leave-active"],o={animateIn:function(t,e,n){i(!0,t,e,n)},animateOut:function(t,e,n){i(!1,t,e,n)}},a=function(t,e,i){function n(r){a||(a=window.performance.now()),o=r-a,i.apply(e),t>o?s=window.requestAnimationFrame(n,e):(window.cancelAnimationFrame(s),e.trigger("finished.zf.animate",[e]).triggerHandler("finished.zf.animate",[e]))}var s,o,a=null;s=window.requestAnimationFrame(n)};e.Move=a,e.Motion=o}(jQuery,Foundation),!function(t,e){"use strict";e.Nest={Feather:function(e,i){e.attr("role","menubar"),i=i||"zf";var n=e.find("li").attr({role:"menuitem"}),s="is-"+i+"-submenu",o=s+"-item",a="is-"+i+"-submenu-parent";e.find("a:first").attr("tabindex",0),n.each(function(){var e=t(this),i=e.children("ul");i.length&&(e.addClass("has-submenu "+a).attr({"aria-haspopup":!0,"aria-selected":!1,"aria-expanded":!1,"aria-label":e.children("a:first").text()}),i.addClass("submenu "+s).attr({"data-submenu":"","aria-hidden":!0,role:"menu"})),e.parent("[data-submenu]").length&&e.addClass("is-submenu-item "+o)})},Burn:function(t,e){var i=(t.find("li").removeAttr("tabindex"),"is-"+e+"-submenu"),n=i+"-item",s="is-"+e+"-submenu-parent";t.find("*").removeClass(i+" "+n+" "+s+" has-submenu is-submenu-item submenu is-active").removeAttr("data-submenu").css("display","")}}}(jQuery,window.Foundation),!function(t,e){"use strict";var i=function(t,e,i){var n,s,o=this,a=e.duration,r=Object.keys(t.data())[0]||"timer",l=-1;this.restart=function(){l=-1,clearTimeout(s),this.start()},this.start=function(){clearTimeout(s),l=0>=l?a:l,t.data("paused",!1),n=Date.now(),s=setTimeout(function(){e.infinite&&o.restart(),i()},l),t.trigger("timerstart.zf."+r)},this.pause=function(){clearTimeout(s),t.data("paused",!0);var e=Date.now();l-=e-n,t.trigger("timerpaused.zf."+r)}},n=function(e,i){var n=e.length;0===n&&i();var s=function(){n--,0===n&&i()};e.each(function(){this.complete?s():"undefined"!=typeof this.naturalWidth&&this.naturalWidth>0?s():t(this).one("load",function(){s()})})};e.Timer=i,e.onImagesLoaded=n}(jQuery,window.Foundation),function(t){function e(){this.removeEventListener("touchmove",i),this.removeEventListener("touchend",e),d=!1}function i(i){if(t.spotSwipe.preventDefault&&i.preventDefault(),d){var n,s=i.touches[0].pageX,a=(i.touches[0].pageY,o-s);l=(new Date).getTime()-r,Math.abs(a)>=t.spotSwipe.moveThreshold&&l<=t.spotSwipe.timeThreshold&&(n=a>0?"left":"right"),n&&(i.preventDefault(),e.call(this),t(this).trigger("swipe",n).trigger("swipe"+n))}}function n(t){1==t.touches.length&&(o=t.touches[0].pageX,a=t.touches[0].pageY,d=!0,r=(new Date).getTime(),this.addEventListener("touchmove",i,!1),this.addEventListener("touchend",e,!1))}function s(){this.addEventListener&&this.addEventListener("touchstart",n,!1)}t.spotSwipe={version:"1.0.0",enabled:"ontouchstart"in document.documentElement,preventDefault:!1,moveThreshold:75,timeThreshold:200};var o,a,r,l,d=!1;t.event.special.swipe={setup:s},t.each(["left","up","down","right"],function(){t.event.special["swipe"+this]={setup:function(){t(this).on("swipe",t.noop)}}})}(jQuery),!function(t){t.fn.addTouch=function(){this.each(function(i,n){t(n).bind("touchstart touchmove touchend touchcancel",function(){e(event)})});var e=function(t){var e=t.changedTouches,i=e[0],n={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"},s=n[t.type],o=document.createEvent("MouseEvent");o.initMouseEvent(s,!0,!0,window,1,i.screenX,i.screenY,i.clientX,i.clientY,!1,!1,!1,!1,0,null),i.target.dispatchEvent(o)}}}(jQuery),!function(t,e){"use strict";e(document).on("click.zf.trigger","[data-open]",function(){var t=e(this).data("open");e("#"+t).triggerHandler("open.zf.trigger",[e(this)])}),e(document).on("click.zf.trigger","[data-close]",function(){var t=e(this).data("close");t?e("#"+t).triggerHandler("close.zf.trigger",[e(this)]):e(this).trigger("close.zf.trigger")}),e(document).on("click.zf.trigger","[data-toggle]",function(){var t=e(this).data("toggle");e("#"+t).triggerHandler("toggle.zf.trigger",[e(this)])}),e(document).on("close.zf.trigger","[data-closable]",function(){var i=e(this).data("closable")||"fade-out";t.Motion?t.Motion.animateOut(e(this),i,function(){e(this).trigger("closed.zf")}):e(this).fadeOut().trigger("closed.zf")});var i=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;eBack',wrapper:"
    ",closeOnClick:!1},i.prototype._init=function(){this.$submenuAnchors=this.$element.find("li.has-submenu"),this.$submenus=this.$submenuAnchors.children("[data-submenu]"),this.$menuItems=this.$element.find("li").not(".js-drilldown-back").attr("role","menuitem"),this._prepareMenu(),this._keyboardEvents()},i.prototype._prepareMenu=function(){var e=this;this.$submenuAnchors.each(function(){var i=t(this),n=i.find("a:first");n.data("savedHref",n.attr("href")).removeAttr("href"),i.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"menu"}),e._events(i)}),this.$submenus.each(function(){var i=t(this),n=i.find(".js-drilldown-back");n.length||i.prepend(e.options.backButton),e._back(i)}),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=t(this.options.wrapper).addClass("is-drilldown").css(this._getMaxDims()),this.$element.wrap(this.$wrapper))},i.prototype._events=function(e){var i=this;e.off("click.zf.drilldown").on("click.zf.drilldown",function(n){if(t(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&(n.stopImmediatePropagation(),n.preventDefault()),i._show(e),i.options.closeOnClick){var s=t("body").not(i.$wrapper);s.off(".zf.drilldown").on("click.zf.drilldown",function(t){t.preventDefault(),i._hideAll(),s.off(".zf.drilldown")})}})},i.prototype._keyboardEvents=function(){var i=this;this.$menuItems.add(this.$element.find(".js-drilldown-back")).on("keydown.zf.drilldown",function(n){var s,o,a=t(this),r=a.parent("ul").children("li");r.each(function(e){return t(this).is(a)?(s=r.eq(Math.max(0,e-1)),void(o=r.eq(Math.min(e+1,r.length-1)))):void 0}),e.Keyboard.handleKey(n,"Drilldown",{next:function(){a.is(i.$submenuAnchors)&&(i._show(a),a.on(e.transitionend(a),function(){a.find("ul li").filter(i.$menuItems).first().focus()}))},previous:function(){i._hide(a.parent("ul")),a.parent("ul").on(e.transitionend(a),function(){setTimeout(function(){ -a.parent("ul").parent("li").focus()},1)})},up:function(){s.focus()},down:function(){o.focus()},close:function(){i._back()},open:function(){a.is(i.$menuItems)?a.is(i.$submenuAnchors)&&(i._show(a),setTimeout(function(){a.find("ul li").filter(i.$menuItems).first().focus()},1)):(i._hide(a.parent("ul")),setTimeout(function(){a.parent("ul").parent("li").focus()},1))},handled:function(){n.preventDefault(),n.stopImmediatePropagation()}})})},i.prototype._hideAll=function(){var t=this.$element.find(".is-drilldown-sub.is-active").addClass("is-closing");t.one(e.transitionend(t),function(e){t.removeClass("is-active is-closing")}),this.$element.trigger("closed.zf.drilldown")},i.prototype._back=function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",function(i){i.stopImmediatePropagation(),e._hide(t)})},i.prototype._menuLinkEvents=function(){var t=this;this.$menuItems.not(".has-submenu").off("click.zf.drilldown").on("click.zf.drilldown",function(e){setTimeout(function(){t._hideAll()},0)})},i.prototype._show=function(t){t.children("[data-submenu]").addClass("is-active"),this.$element.trigger("open.zf.drilldown",[t])},i.prototype._hide=function(t){t.addClass("is-closing").one(e.transitionend(t),function(){t.removeClass("is-active is-closing")}),t.trigger("hide.zf.drilldown",[t])},i.prototype._getMaxDims=function(){var e=0,i={};return this.$submenus.add(this.$element).each(function(){var i=t(this).children("li").length;e=i>e?i:e}),i.height=e*this.$menuItems[0].getBoundingClientRect().height+"px",i.width=this.$element[0].getBoundingClientRect().width+"px",i},i.prototype.destroy=function(){this._hideAll(),e.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back").remove().end().find(".is-active, .is-closing, .is-drilldown-sub").removeClass("is-active is-closing is-drilldown-sub").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role").off(".zf.drilldown").end().off("zf.drilldown"),this.$element.find("a").each(function(){var e=t(this);e.data("savedHref")&&e.attr("href",e.data("savedHref")).removeData("savedHref")}),e.unregisterPlugin(this)},e.plugin(i,"Drilldown")}(jQuery,window.Foundation),!function(t,e){"use strict";function i(n,s){this.$element=n,this.options=t.extend({},i.defaults,this.$element.data(),s),this._init(),e.registerPlugin(this,"Dropdown"),e.Keyboard.register("Dropdown",{ENTER:"open",SPACE:"open",ESCAPE:"close",TAB:"tab_forward",SHIFT_TAB:"tab_backward"})}i.defaults={hoverDelay:250,hover:!1,hoverPane:!1,vOffset:1,hOffset:1,positionClass:"",trapFocus:!1,autoFocus:!1,closeOnClick:!1},i.prototype._init=function(){var i=this.$element.attr("id");this.$anchor=t('[data-toggle="'+i+'"]')||t('[data-open="'+i+'"]'),this.$anchor.attr({"aria-controls":i,"data-is-focus":!1,"data-yeti-box":i,"aria-haspopup":!0,"aria-expanded":!1}),this.options.positionClass=this.getPositionClass(),this.counter=4,this.usedPositions=[],this.$element.attr({"aria-hidden":"true","data-yeti-box":i,"data-resize":i,"aria-labelledby":this.$anchor[0].id||e.GetYoDigits(6,"dd-anchor")}),this._events()},i.prototype.getPositionClass=function(){var t=this.$element[0].className.match(/(top|left|right)/g);return t=t?t[0]:""},i.prototype._reposition=function(t){this.usedPositions.push(t?t:"bottom"),!t&&this.usedPositions.indexOf("top")<0?this.$element.addClass("top"):"top"===t&&this.usedPositions.indexOf("bottom")<0?this.$element.removeClass(t):"left"===t&&this.usedPositions.indexOf("right")<0?this.$element.removeClass(t).addClass("right"):"right"===t&&this.usedPositions.indexOf("left")<0?this.$element.removeClass(t).addClass("left"):!t&&this.usedPositions.indexOf("top")>-1&&this.usedPositions.indexOf("left")<0?this.$element.addClass("left"):"top"===t&&this.usedPositions.indexOf("bottom")>-1&&this.usedPositions.indexOf("left")<0?this.$element.removeClass(t).addClass("left"):"left"===t&&this.usedPositions.indexOf("right")>-1&&this.usedPositions.indexOf("bottom")<0?this.$element.removeClass(t):"right"===t&&this.usedPositions.indexOf("left")>-1&&this.usedPositions.indexOf("bottom")<0?this.$element.removeClass(t):this.$element.removeClass(t),this.classChanged=!0,this.counter--},i.prototype._setPosition=function(){if("false"===this.$anchor.attr("aria-expanded"))return!1;var t=this.getPositionClass(),i=e.Box.GetDimensions(this.$element),n=(e.Box.GetDimensions(this.$anchor),"left"===t?"left":"right"===t?"left":"top"),s="top"===n?"height":"width";"height"===s?this.options.vOffset:this.options.hOffset;if(i.width>=i.windowDims.width||!this.counter&&!e.Box.ImNotTouchingYou(this.$element))return this.$element.offset(e.Box.GetOffsets(this.$element,this.$anchor,"center bottom",this.options.vOffset,this.options.hOffset,!0)).css({width:i.windowDims.width-2*this.options.hOffset,height:"auto"}),this.classChanged=!0,!1;for(this.$element.offset(e.Box.GetOffsets(this.$element,this.$anchor,t,this.options.vOffset,this.options.hOffset));!e.Box.ImNotTouchingYou(this.$element)&&this.counter;)this._reposition(t),this._setPosition()},i.prototype._events=function(){var i=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":this._setPosition.bind(this)}),this.options.hover&&(this.$anchor.off("mouseenter.zf.dropdown mouseleave.zf.dropdown").on("mouseenter.zf.dropdown",function(){clearTimeout(i.timeout),i.timeout=setTimeout(function(){i.open(),i.$anchor.data("hover",!0)},i.options.hoverDelay)}).on("mouseleave.zf.dropdown",function(){clearTimeout(i.timeout),i.timeout=setTimeout(function(){i.close(),i.$anchor.data("hover",!1)},i.options.hoverDelay)}),this.options.hoverPane&&this.$element.off("mouseenter.zf.dropdown mouseleave.zf.dropdown").on("mouseenter.zf.dropdown",function(){clearTimeout(i.timeout)}).on("mouseleave.zf.dropdown",function(){clearTimeout(i.timeout),i.timeout=setTimeout(function(){i.close(),i.$anchor.data("hover",!1)},i.options.hoverDelay)})),this.$anchor.add(this.$element).on("keydown.zf.dropdown",function(n){var s=t(this),o=e.Keyboard.findFocusable(i.$element);e.Keyboard.handleKey(n,"Dropdown",{tab_forward:function(){i.$element.find(":focus").is(o.eq(-1))&&(i.options.trapFocus?(o.eq(0).focus(),n.preventDefault()):i.close())},tab_backward:function(){(i.$element.find(":focus").is(o.eq(0))||i.$element.is(":focus"))&&(i.options.trapFocus?(o.eq(-1).focus(),n.preventDefault()):i.close())},open:function(){s.is(i.$anchor)&&(i.open(),i.$element.attr("tabindex",-1).focus(),n.preventDefault())},close:function(){i.close(),i.$anchor.focus()}})})},i.prototype._addBodyHandler=function(){var e=t(document.body).not(this.$element),i=this;e.off("click.zf.dropdown").on("click.zf.dropdown",function(t){i.$anchor.is(t.target)||i.$anchor.find(t.target).length||i.$element.find(t.target).length||(i.close(),e.off("click.zf.dropdown"))})},i.prototype.open=function(){if(this.$element.trigger("closeme.zf.dropdown",this.$element.attr("id")),this.$anchor.addClass("hover").attr({"aria-expanded":!0}),this._setPosition(),this.$element.addClass("is-open").attr({"aria-hidden":!1}),this.options.autoFocus){var t=e.Keyboard.findFocusable(this.$element);t.length&&t.eq(0).focus()}this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdown",[this.$element])},i.prototype.close=function(){if(!this.$element.hasClass("is-open"))return!1;if(this.$element.removeClass("is-open").attr({"aria-hidden":!0}),this.$anchor.removeClass("hover").attr("aria-expanded",!1),this.classChanged){var t=this.getPositionClass();t&&this.$element.removeClass(t),this.$element.addClass(this.options.positionClass).css({height:"",width:""}),this.classChanged=!1,this.counter=4,this.usedPositions.length=0}this.$element.trigger("hide.zf.dropdown",[this.$element])},i.prototype.toggle=function(){if(this.$element.hasClass("is-open")){if(this.$anchor.data("hover"))return;this.close()}else this.open()},i.prototype.destroy=function(){this.$element.off(".zf.trigger").hide(),this.$anchor.off(".zf.dropdown"),e.unregisterPlugin(this)},e.plugin(i,"Dropdown")}(jQuery,window.Foundation),!function(t,e){"use strict";function i(n,s){this.$element=n,this.options=t.extend({},i.defaults,this.$element.data(),s),e.Nest.Feather(this.$element,"dropdown"),this._init(),e.registerPlugin(this,"DropdownMenu"),e.Keyboard.register("DropdownMenu",{ENTER:"open",SPACE:"open",ARROW_RIGHT:"next",ARROW_UP:"up",ARROW_DOWN:"down",ARROW_LEFT:"previous",ESCAPE:"close"})}i.defaults={disableHover:!1,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"left",closeOnClick:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0},i.prototype._init=function(){var t=this.$element.find("li.is-dropdown-submenu-parent");this.$element.children(".is-dropdown-submenu-parent").children(".is-dropdown-submenu").addClass("first-sub"),this.$menuItems=this.$element.find('[role="menuitem"]'),this.$tabs=this.$element.children('[role="menuitem"]'),this.isVert=this.$element.hasClass(this.options.verticalClass),this.$tabs.find("ul.is-dropdown-submenu").addClass(this.options.verticalClass),this.$element.hasClass(this.options.rightClass)||"right"===this.options.alignment?(this.options.alignment="right",t.addClass("is-left-arrow opens-left")):t.addClass("is-right-arrow opens-right"),this.isVert||this.$tabs.filter(".is-dropdown-submenu-parent").removeClass("is-right-arrow is-left-arrow opens-right opens-left").addClass("is-down-arrow"),this.changed=!1,this._events()},i.prototype._events=function(){var i,n=this,s="ontouchstart"in window||"undefined"!=typeof window.ontouchstart,o="is-dropdown-submenu-parent";(this.options.clickOpen||s)&&this.$menuItems.on("click.zf.dropdownmenu touchstart.zf.dropdownmenu",function(e){var i=t(e.target).parentsUntil("ul","."+o),a=i.hasClass(o),r="true"===i.attr("data-is-click");i.children(".is-dropdown-submenu");if(a)if(r){if(!n.options.closeOnClick||!n.options.clickOpen&&!s||n.options.forceFollow&&s)return;e.stopImmediatePropagation(),e.preventDefault(),n._hide(i)}else e.preventDefault(),e.stopImmediatePropagation(),n._show(i.children(".is-dropdown-submenu")),i.add(i.parentsUntil(n.$element,"."+o)).attr("data-is-click",!0)}),this.options.disableHover||this.$menuItems.on("mouseenter.zf.dropdownmenu",function(e){e.stopImmediatePropagation();var s=t(this),a=s.hasClass(o);a&&(clearTimeout(i),i=setTimeout(function(){n._show(s.children(".is-dropdown-submenu"))},n.options.hoverDelay))}).on("mouseleave.zf.dropdownmenu",function(e){var s=t(this),a=s.hasClass(o);if(a&&n.options.autoclose){if("true"===s.attr("data-is-click")&&n.options.clickOpen)return!1;i=setTimeout(function(){n._hide(s)},n.options.closingTime)}}),this.$menuItems.on("keydown.zf.dropdownmenu",function(i){var s,o,a=t(i.target).parentsUntil("ul",'[role="menuitem"]'),r=n.$tabs.index(a)>-1,l=r?n.$tabs:a.siblings("li").add(a);l.each(function(e){return t(this).is(a)?(s=l.eq(e-1),void(o=l.eq(e+1))):void 0});var d=function(){a.is(":last-child")||o.children("a:first").focus()},h=function(){s.children("a:first").focus()},u=function(){var t=a.children("ul.is-dropdown-submenu");t.length&&(n._show(t),a.find("li > a:first").focus())},f=function(){var t=a.parent("ul").parent("li");t.children("a:first").focus(),n._hide(t)},c={open:u,close:function(){n._hide(n.$element),n.$menuItems.find("a:first").focus()},handled:function(){i.preventDefault(),i.stopImmediatePropagation()}};r?n.vertical?"left"===n.options.alignment?t.extend(c,{down:d,up:h,next:u,previous:f}):t.extend(c,{down:d,up:h,next:f,previous:u}):t.extend(c,{next:d,previous:h,down:u,up:f}):"left"===n.options.alignment?t.extend(c,{next:u,previous:f,down:d,up:h}):t.extend(c,{next:f,previous:u,down:d,up:h}),e.Keyboard.handleKey(i,"DropdownMenu",c)})},i.prototype._addBodyHandler=function(){var e=t(document.body),i=this;e.off("mouseup.zf.dropdownmenu touchend.zf.dropdownmenu").on("mouseup.zf.dropdownmenu touchend.zf.dropdownmenu",function(t){var n=i.$element.find(t.target);n.length||(i._hide(),e.off("mouseup.zf.dropdownmenu touchend.zf.dropdownmenu"))})},i.prototype._show=function(i){var n=this.$tabs.index(this.$tabs.filter(function(e,n){return t(n).find(i).length>0})),s=i.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(s,n),i.css("visibility","hidden").addClass("js-dropdown-active").attr({"aria-hidden":!1}).parent("li.is-dropdown-submenu-parent").addClass("is-active").attr({"aria-selected":!0,"aria-expanded":!0});var o=e.Box.ImNotTouchingYou(i,null,!0);if(!o){var a="left"===this.options.alignment?"-right":"-left",r=i.parent(".is-dropdown-submenu-parent");r.removeClass("opens"+a).addClass("opens-"+this.options.alignment),o=e.Box.ImNotTouchingYou(i,null,!0),o||r.removeClass("opens-"+this.options.alignment).addClass("opens-inner"),this.changed=!0}i.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownmenu",[i])},i.prototype._hide=function(t,e){var i;i=t&&t.length?t:void 0!==e?this.$tabs.not(function(t,i){return t===e}):this.$element;var n=i.hasClass("is-active")||i.find(".is-active").length>0;if(n){if(i.find("li.is-active").add(i).attr({"aria-selected":!1,"aria-expanded":!1,"data-is-click":!1}).removeClass("is-active"),i.find("ul.js-dropdown-active").attr({"aria-hidden":!0}).removeClass("js-dropdown-active"),this.changed||i.find("opens-inner").length){var s="left"===this.options.alignment?"right":"left";i.find("li.is-dropdown-submenu-parent").add(i).removeClass("opens-inner opens-"+this.options.alignment).addClass("opens-"+s),this.changed=!1}this.$element.trigger("hide.zf.dropdownmenu",[i])}},i.prototype.destroy=function(){this.$menuItems.off(".zf.dropdownmenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),e.Nest.Burn(this.$element,"dropdown"),e.unregisterPlugin(this)},e.plugin(i,"DropdownMenu")}(jQuery,window.Foundation),!function(t,e){"use strict";function i(n,s){this.$element=n,this.options=e.extend({},i.defaults,this.$element.data(),s),this._init(),t.registerPlugin(this,"Equalizer")}i.defaults={equalizeOnStack:!0,equalizeByRow:!1,equalizeOn:""},i.prototype._init=function(){var i=this.$element.attr("data-equalizer")||"",n=this.$element.find('[data-equalizer-watch="'+i+'"]');this.$watched=n.length?n:this.$element.find("[data-equalizer-watch]"),this.$element.attr("data-resize",i||t.GetYoDigits(6,"eq")),this.hasNested=this.$element.find("[data-equalizer]").length>0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1;var s,o=this.$element.find("img");this.options.equalizeOn?(s=this._checkMQ(),e(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==s&&s===!1||void 0===s)&&(o.length?t.onImagesLoaded(o,this._reflow.bind(this)):this._reflow())},i.prototype._pauseEvents=function(){this.isOn=!1,this.$element.off(".zf.equalizer resizeme.zf.trigger")},i.prototype._events=function(){var t=this;this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",function(e){e.target!==t.$element[0]&&t._reflow()}):this.$element.on("resizeme.zf.trigger",this._reflow.bind(this)),this.isOn=!0},i.prototype._checkMQ=function(){var e=!t.MediaQuery.atLeast(this.options.equalizeOn);return e?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),e},i.prototype._killswitch=function(){},i.prototype._reflow=function(){return!this.options.equalizeOnStack&&this._isStacked()?(this.$watched.css("height","auto"),!1):void(this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this)))},i.prototype._isStacked=function(){return this.$watched[0].offsetTop!==this.$watched[1].offsetTop},i.prototype.getHeights=function(t){for(var e=[],i=0,n=this.$watched.length;n>i;i++)this.$watched[i].style.height="auto",e.push(this.$watched[i].offsetHeight);t(e)},i.prototype.getHeightsByRow=function(t){var i=this.$watched.first().offset().top,n=[],s=0;n[s]=[];for(var o=0,a=this.$watched.length;a>o;o++){this.$watched[o].style.height="auto";var r=e(this.$watched[o]).offset().top;r!=i&&(s++,n[s]=[],i=r),n[s].push([this.$watched[o],this.$watched[o].offsetHeight])}for(var o=0,a=n.length;a>o;o++){var l=e(n[o]).map(function(){return this[1]}).get(),d=Math.max.apply(null,l);n[o].push(d)}t(n)},i.prototype.applyHeight=function(t){var e=Math.max.apply(null,t);this.$element.trigger("preequalized.zf.equalizer"),this.$watched.css("height",e),this.$element.trigger("postequalized.zf.equalizer")},i.prototype.applyHeightByRow=function(t){this.$element.trigger("preequalized.zf.equalizer");for(var i=0,n=t.length;n>i;i++){var s=t[i].length,o=t[i][s-1];if(2>=s)e(t[i][0][0]).css({height:"auto"});else{this.$element.trigger("preequalizedrow.zf.equalizer");for(var a=0,r=s-1;r>a;a++)e(t[i][a][0]).css({height:o});this.$element.trigger("postequalizedrow.zf.equalizer")}}this.$element.trigger("postequalized.zf.equalizer")},i.prototype.destroy=function(){this._pauseEvents(),this.$watched.css("height","auto"),t.unregisterPlugin(this)},t.plugin(i,"Equalizer"),"undefined"!=typeof module&&"undefined"!=typeof module.exports&&(module.exports=i),"function"==typeof define&&define(["foundation"],function(){return i})}(Foundation,jQuery),!function(t,e){"use strict";function i(n,s){this.$element=n,this.options=e.extend({},i.defaults,s),this.rules=[],this.currentPath="",this._init(),this._events(),t.registerPlugin(this,"Interchange")}i.defaults={rules:null},i.SPECIAL_QUERIES={landscape:"screen and (orientation: landscape)",portrait:"screen and (orientation: portrait)",retina:"only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx)"},i.prototype._init=function(){this._addBreakpoints(),this._generateRules(),this._reflow()},i.prototype._events=function(){e(window).on("resize.zf.interchange",t.util.throttle(this._reflow.bind(this),50))},i.prototype._reflow=function(){var t;for(var e in this.rules){var i=this.rules[e];window.matchMedia(i.query).matches&&(t=i)}t&&this.replace(t.path)},i.prototype._addBreakpoints=function(){for(var e in t.MediaQuery.queries){var n=t.MediaQuery.queries[e];i.SPECIAL_QUERIES[n.name]=n.value}},i.prototype._generateRules=function(){var t,e=[];t=this.options.rules?this.options.rules:this.$element.data("interchange").match(/\[.*?\]/g);for(var n in t){var s=t[n].slice(1,-1).split(", "),o=s.slice(0,-1).join(""),a=s[s.length-1];i.SPECIAL_QUERIES[a]&&(a=i.SPECIAL_QUERIES[a]),e.push({path:o,query:a})}this.rules=e},i.prototype.replace=function(t){if(this.currentPath!==t){var i=this;"IMG"===this.$element[0].nodeName?this.$element.attr("src",t).load(function(){i.currentPath=t}):t.match(/\.(gif|jpg|jpeg|tiff|png)([?#].*)?/i)?this.$element.css({"background-image":"url("+t+")"}):e.get(t,function(n){i.$element.html(n),e(n).foundation(),i.currentPath=t}),this.$element.trigger("replaced.zf.interchange")}},i.prototype.destroy=function(){},t.plugin(i,"Interchange"),"undefined"!=typeof module&&"undefined"!=typeof module.exports&&(module.exports=i),"function"==typeof define&&define(["foundation"],function(){return i})}(Foundation,jQuery),!function(t,e){"use strict";function i(n,s){this.$element=n,this.options=e.extend({},i.defaults,this.$element.data(),s),this._init(),t.registerPlugin(this,"Magellan")}i.defaults={animationDuration:500,animationEasing:"linear",threshold:50,activeClass:"active",deepLinking:!1,barOffset:0},i.prototype._init=function(){var i=this.$element[0].id||t.GetYoDigits(6,"magellan");this.$targets=e("[data-magellan-target]"),this.$links=this.$element.find("a"),this.$element.attr({"data-resize":i,"data-scroll":i,id:i}),this.$active=e(),this.scrollPos=parseInt(window.pageYOffset,10),this._events()},i.prototype.calcPoints=function(){var t=this,i=document.body,n=document.documentElement;this.points=[],this.winHeight=Math.round(Math.max(window.innerHeight,n.clientHeight)),this.docHeight=Math.round(Math.max(i.scrollHeight,i.offsetHeight,n.clientHeight,n.scrollHeight,n.offsetHeight)),this.$targets.each(function(){var i=e(this),n=Math.round(i.offset().top-t.options.threshold);i.targetPoint=n,t.points.push(n)})},i.prototype._events=function(){var t=this,i=e("html, body"),n={duration:t.options.animationDuration,easing:t.options.animationEasing};e(window).one("load",function(){t.calcPoints(),t._updateActive()}),this.$element.on({"resizeme.zf.trigger":this.reflow.bind(this),"scrollme.zf.trigger":this._updateActive.bind(this)}).on("click.zf.magellan",'a[href^="#"]',function(s){s.preventDefault();var o=this.getAttribute("href"),a=e(o).offset().top-t.options.threshold/2-t.options.barOffset;i.stop(!0).animate({scrollTop:a},n)})},i.prototype.reflow=function(){this.calcPoints(),this._updateActive()},i.prototype._updateActive=function(){var t,e=parseInt(window.pageYOffset,10);if(e+this.winHeight===this.docHeight)t=this.points.length-1;else if(e=t:t-n.options.threshold<=e});t=s.length?s.length-1:0}if(this.$active.removeClass(this.options.activeClass),this.$active=this.$links.eq(t).addClass(this.options.activeClass),this.options.deepLinking){var o=this.$active[0].getAttribute("href");window.history.pushState?window.history.pushState(null,null,o):window.location.hash=o}this.scrollPos=e,this.$element.trigger("update.zf.magellan",[this.$active])},i.prototype.destroy=function(){if(this.$element.off(".zf.trigger .zf.magellan").find("."+this.options.activeClass).removeClass(this.options.activeClass),this.options.deepLinking){var e=this.$active[0].getAttribute("href");window.location.hash.replace(e,"")}t.unregisterPlugin(this)},t.plugin(i,"Magellan"),"undefined"!=typeof module&&"undefined"!=typeof module.exports&&(module.exports=i),"function"==typeof define&&define(["foundation"],function(){return i})}(Foundation,jQuery),!function(t,e){"use strict";function i(n,s){this.$element=n,this.options=t.extend({},i.defaults,this.$element.data(),s),this.$lastTrigger=t(),this._init(),this._events(),e.registerPlugin(this,"OffCanvas")}i.defaults={closeOnClick:!0,transitionTime:0,position:"left",forceTop:!0,isRevealed:!1,revealOn:null,autoFocus:!0,revealClass:"reveal-for-",trapFocus:!1},i.prototype._init=function(){var e=this.$element.attr("id");if(this.$element.attr("aria-hidden","true"),t(document).find('[data-open="'+e+'"], [data-close="'+e+'"], [data-toggle="'+e+'"]').attr("aria-expanded","false").attr("aria-controls",e),this.options.closeOnClick)if(t(".js-off-canvas-exit").length)this.$exiter=t(".js-off-canvas-exit");else{var i=document.createElement("div");i.setAttribute("class","js-off-canvas-exit"),t("[data-off-canvas-content]").append(i),this.$exiter=t(i)}this.options.isRevealed=this.options.isRevealed||new RegExp(this.options.revealClass,"g").test(this.$element[0].className),this.options.isRevealed&&(this.options.revealOn=this.options.revealOn||this.$element[0].className.match(/(reveal-for-medium|reveal-for-large)/g)[0].split("-")[2],this._setMQChecker()),this.options.transitionTime||(this.options.transitionTime=1e3*parseFloat(window.getComputedStyle(t("[data-off-canvas-wrapper]")[0]).transitionDuration))},i.prototype._events=function(){if(this.$element.off(".zf.trigger .zf.offcanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offcanvas":this._handleKeyboard.bind(this)}),this.$exiter.length){this.$exiter.on({"click.zf.offcanvas":this.close.bind(this)})}},i.prototype._setMQChecker=function(){var i=this;t(window).on("changed.zf.mediaquery",function(){e.MediaQuery.atLeast(i.options.revealOn)?i.reveal(!0):i.reveal(!1)}).one("load.zf.offcanvas",function(){e.MediaQuery.atLeast(i.options.revealOn)&&i.reveal(!0)})},i.prototype.reveal=function(t){var e=this.$element.find("[data-close]");t?(this.close(),this.isRevealed=!0,this.$element.off("open.zf.trigger toggle.zf.trigger"),e.length&&e.hide()):(this.isRevealed=!1,this.$element.on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),e.length&&e.show())},i.prototype.open=function(i,n){if(!this.$element.hasClass("is-open")&&!this.isRevealed){var s=this;t(document.body);t("body").scrollTop(0),e.Move(this.options.transitionTime,this.$element,function(){t("[data-off-canvas-wrapper]").addClass("is-off-canvas-open is-open-"+s.options.position),s.$element.addClass("is-open")}),this.$element.attr("aria-hidden","false").trigger("opened.zf.offcanvas"),n&&(this.$lastTrigger=n.attr("aria-expanded","true")),this.options.autoFocus&&this.$element.one("finished.zf.animate",function(){s.$element.find("a, button").eq(0).focus()}),this.options.trapFocus&&(t("[data-off-canvas-content]").attr("tabindex","-1"),this._trapFocus())}},i.prototype._trapFocus=function(){var t=e.Keyboard.findFocusable(this.$element),i=t.eq(0),n=t.eq(-1);t.off(".zf.offcanvas").on("keydown.zf.offcanvas",function(t){(9===t.which||9===t.keycode)&&(t.target!==n[0]||t.shiftKey||(t.preventDefault(),i.focus()),t.target===i[0]&&t.shiftKey&&(t.preventDefault(),n.focus()))})},i.prototype.close=function(e){if(this.$element.hasClass("is-open")&&!this.isRevealed){var i=this;t("[data-off-canvas-wrapper]").removeClass("is-off-canvas-open is-open-"+i.options.position),i.$element.removeClass("is-open"),this.$element.attr("aria-hidden","true").trigger("closed.zf.offcanvas"),this.$lastTrigger.attr("aria-expanded","false"),this.options.trapFocus&&t("[data-off-canvas-content]").removeAttr("tabindex")}},i.prototype.toggle=function(t,e){this.$element.hasClass("is-open")?this.close(t,e):this.open(t,e)},i.prototype._handleKeyboard=function(t){27===t.which&&(t.stopPropagation(),t.preventDefault(),this.close(),this.$lastTrigger.focus())},i.prototype.destroy=function(){this.close(),this.$element.off(".zf.trigger .zf.offcanvas"),this.$exiter.off(".zf.offcanvas"),e.unregisterPlugin(this)},e.plugin(i,"OffCanvas")}(jQuery,Foundation),!function(t,e){"use strict";function i(n,s){this.$element=n,this.options=t.extend({},i.defaults,this.$element.data(),s),this._init(),e.registerPlugin(this,"Orbit"),e.Keyboard.register("Orbit",{ltr:{ARROW_RIGHT:"next",ARROW_LEFT:"previous"},rtl:{ARROW_LEFT:"next",ARROW_RIGHT:"previous"}})}i.defaults={bullets:!0,navButtons:!0,animInFromRight:"slide-in-right",animOutToRight:"slide-out-right",animInFromLeft:"slide-in-left",animOutToLeft:"slide-out-left",autoPlay:!0,timerDelay:5e3,infiniteWrap:!0,swipe:!0,pauseOnHover:!0,accessible:!0,containerClass:"orbit-container",slideClass:"orbit-slide",boxOfBullets:"orbit-bullets",nextClass:"orbit-next",prevClass:"orbit-previous",useMUI:!0},i.prototype._init=function(){this.$wrapper=this.$element.find("."+this.options.containerClass),this.$slides=this.$element.find("."+this.options.slideClass);var t=this.$element.find("img"),i=this.$slides.filter(".is-active");i.length||this.$slides.eq(0).addClass("is-active"),this.options.useMUI||this.$slides.addClass("no-motionui"),t.length?e.onImagesLoaded(t,this._prepareForOrbit.bind(this)):this._prepareForOrbit(),this.options.bullets&&this._loadBullets(),this._events(),this.options.autoPlay&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)},i.prototype._loadBullets=function(){this.$bullets=this.$element.find("."+this.options.boxOfBullets).find("button")},i.prototype.geoSync=function(){var t=this;this.timer=new e.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},function(){t.changeSlide(!0)}),this.timer.start()},i.prototype._prepareForOrbit=function(){var t=this;this._setWrapperHeight(function(e){t._setSlideHeight(e)})},i.prototype._setWrapperHeight=function(e){var i,n=0,s=0;this.$slides.each(function(){i=this.getBoundingClientRect().height,t(this).attr("data-slide",s),s&&t(this).css({position:"relative",display:"none"}),n=i>n?i:n,s++}),s===this.$slides.length&&(this.$wrapper.css({height:n}),e(n))},i.prototype._setSlideHeight=function(e){this.$slides.each(function(){t(this).css("max-height",e)})},i.prototype._events=function(){var i=this;if(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",function(t){t.preventDefault(),i.changeSlide(!0)}).on("swiperight.zf.orbit",function(t){t.preventDefault(),i.changeSlide(!1)}),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",function(){i.$element.data("clickedOn",i.$element.data("clickedOn")?!1:!0),i.timer[i.$element.data("clickedOn")?"pause":"start"]()}),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",function(){i.timer.pause()}).on("mouseleave.zf.orbit",function(){i.$element.data("clickedOn")||i.timer.start()})),this.options.navButtons){var n=this.$element.find("."+this.options.nextClass+", ."+this.options.prevClass);n.attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",function(){i.changeSlide(t(this).hasClass(i.options.nextClass))})}this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",function(){if(/is-active/g.test(this.className))return!1;var e=t(this).data("slide"),n=e>i.$slides.filter(".is-active").data("slide"),s=i.$slides.eq(e);i.changeSlide(n,s,e)}),this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",function(n){e.Keyboard.handleKey(n,"Orbit",{next:function(){i.changeSlide(!0)},previous:function(){i.changeSlide(!1)},handled:function(){t(n.target).is(i.$bullets)&&i.$bullets.filter(".is-active").focus()}})})},i.prototype.changeSlide=function(t,i,n){var s=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(s[0].className))return!1;var o,a=this.$slides.first(),r=this.$slides.last(),l=t?"Right":"Left",d=t?"Left":"Right",h=this;o=i?i:t?this.options.infiniteWrap?s.next("."+this.options.slideClass).length?s.next("."+this.options.slideClass):a:s.next("."+this.options.slideClass):this.options.infiniteWrap?s.prev("."+this.options.slideClass).length?s.prev("."+this.options.slideClass):r:s.prev("."+this.options.slideClass),o.length&&(this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI?(e.Motion.animateIn(o.addClass("is-active").css({position:"absolute",top:0}),this.options["animInFrom"+l],function(){o.css({position:"relative",display:"block"}).attr("aria-live","polite")}),e.Motion.animateOut(s.removeClass("is-active"),this.options["animOutTo"+d],function(){s.removeAttr("aria-live"),h.options.autoPlay&&h.timer.restart()})):(s.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))},i.prototype._updateBullets=function(t){var e=this.$element.find("."+this.options.boxOfBullets).find(".is-active").removeClass("is-active").blur(),i=e.find("span:last").detach();this.$bullets.eq(t).addClass("is-active").append(i)},i.prototype.destroy=function(){delete this.timer,this.$element.off(".zf.orbit").find("*").off(".zf.orbit").end().hide(),e.unregisterPlugin(this)},e.plugin(i,"Orbit")}(jQuery,window.Foundation),!function(t,e){"use strict";function i(i){this.$element=e(i),this.rules=this.$element.data("responsive-menu"),this.currentMq=null,this.currentPlugin=null,this._init(),this._events(),t.registerPlugin(this,"ResponsiveMenu")}var n={dropdown:{cssClass:"dropdown",plugin:t._plugins["dropdown-menu"]||null},drilldown:{cssClass:"drilldown",plugin:t._plugins.drilldown||null},accordion:{cssClass:"accordion-menu",plugin:t._plugins["accordion-menu"]||null}};i.defaults={},i.prototype._init=function(){for(var t={},i=this.rules.split(" "),s=0;s1?o[0]:"small",r=o.length>1?o[1]:o[0];null!==n[r]&&(t[a]=n[r])}this.rules=t,e.isEmptyObject(t)||this._checkMediaQueries()},i.prototype._events=function(){var t=this;e(window).on("changed.zf.mediaquery",function(){ -t._checkMediaQueries()})},i.prototype._checkMediaQueries=function(){var i,s=this;e.each(this.rules,function(e){t.MediaQuery.atLeast(e)&&(i=e)}),i&&(this.currentPlugin instanceof this.rules[i].plugin||(e.each(n,function(t,e){s.$element.removeClass(e.cssClass)}),this.$element.addClass(this.rules[i].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[i].plugin(this.$element,{})))},i.prototype.destroy=function(){this.currentPlugin.destroy(),e(window).off(".zf.ResponsiveMenu"),t.unregisterPlugin(this)},t.plugin(i,"ResponsiveMenu")}(Foundation,jQuery),!function(t,e){"use strict";function i(n,s){this.$element=t(n),this.options=t.extend({},i.defaults,this.$element.data(),s),this._init(),this._events(),e.registerPlugin(this,"ResponsiveToggle")}i.defaults={hideFor:"medium"},i.prototype._init=function(){var e=this.$element.data("responsive-toggle");e||console.error("Your tab bar needs an ID of a Menu as the value of data-tab-bar."),this.$targetMenu=t("#"+e),this.$toggler=this.$element.find("[data-toggle]"),this._update()},i.prototype._events=function(){t(window).on("changed.zf.mediaquery",this._update.bind(this)),this.$toggler.on("click.zf.responsiveToggle",this.toggleMenu.bind(this))},i.prototype._update=function(){e.MediaQuery.atLeast(this.options.hideFor)?(this.$element.hide(),this.$targetMenu.show()):(this.$element.show(),this.$targetMenu.hide())},i.prototype.toggleMenu=function(){e.MediaQuery.atLeast(this.options.hideFor)||(this.$targetMenu.toggle(0),this.$element.trigger("toggled.zf.responsiveToggle"))},i.prototype.destroy=function(){},e.plugin(i,"ResponsiveToggle")}(jQuery,Foundation),!function(t,e){"use strict";function i(n,s){this.$element=n,this.options=e.extend({},i.defaults,this.$element.data(),s),this._init(),t.registerPlugin(this,"Reveal"),t.Keyboard.register("Reveal",{ENTER:"open",SPACE:"open",ESCAPE:"close",TAB:"tab_forward",SHIFT_TAB:"tab_backward"})}i.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:100,hOffset:0,fullScreen:!1,btmOffsetPct:10,overlay:!0,resetOnClose:!1},i.prototype._init=function(){if(this.id=this.$element.attr("id"),this.isActive=!1,this.$anchor=e(e('[data-open="'+this.id+'"]').length?'[data-open="'+this.id+'"]':'[data-toggle="'+this.id+'"]'),this.$anchor.length){var i=this.$anchor[0].id||t.GetYoDigits(6,"reveal");this.$anchor.attr({"aria-controls":this.id,id:i,"aria-haspopup":!0,tabindex:0}),this.$element.attr({"aria-labelledby":i})}(this.options.fullScreen||this.$element.hasClass("full"))&&(this.options.fullScreen=!0,this.options.overlay=!1),this.options.overlay&&!this.$overlay&&(this.$overlay=this._makeOverlay(this.id)),this.$element.attr({role:"dialog","aria-hidden":!0,"data-yeti-box":this.id,"data-resize":this.id}),this._events()},i.prototype._makeOverlay=function(t){var i=e("
    ").addClass("reveal-overlay").attr({tabindex:-1,"aria-hidden":!0}).appendTo("body");return this.options.closeOnClick&&i.attr({"data-close":t}),i},i.prototype._events=function(){var t=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){t.$element.is(":visible")&&t._setPosition(function(){})}}),this.$anchor.length&&this.$anchor.on("keydown.zf.reveal",function(e){(13===e.which||32===e.which)&&(e.stopPropagation(),e.preventDefault(),t.open())}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.reveal",this.close.bind(this))},i.prototype._setPosition=function(e){var i=t.Box.GetDimensions(this.$element),n=this.options.fullScreen?"reveal full":i.height>=.5*i.windowDims.height?"reveal":"center";"reveal full"===n?this.$element.offset(t.Box.GetOffsets(this.$element,null,n,this.options.vOffset)).css({height:i.windowDims.height,width:i.windowDims.width}):t.MediaQuery.atLeast("medium")&&t.Box.ImNotTouchingYou(this.$element,null,!0,!1)?this.$element.css({"max-height":i.windowDims.height-this.options.vOffset*(this.options.btmOffsetPct/100+1),width:""}).offset(t.Box.GetOffsets(this.$element,null,n,this.options.vOffset)):(this.$element.css({width:i.windowDims.width-2*this.options.hOffset}).offset(t.Box.GetOffsets(this.$element,null,"center",this.options.vOffset,this.options.hOffset)),this.changedSize=!0),e()},i.prototype.open=function(){var i=this;this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this._setPosition(function(){i.$element.hide().css({visibility:""}),i.options.multipleOpened||i.$element.trigger("closeme.zf.reveal",i.id),i.options.animationIn?i.options.overlay?t.Motion.animateIn(i.$overlay,"fade-in",function(){t.Motion.animateIn(i.$element,i.options.animationIn,function(){i.focusableElements=t.Keyboard.findFocusable(i.$element)})}):t.Motion.animateIn(i.$element,i.options.animationIn,function(){i.focusableElements=t.Keyboard.findFocusable(i.$element)}):i.options.overlay?i.$overlay.show(0,function(){i.$element.show(i.options.showDelay,function(){})}):i.$element.show(i.options.showDelay,function(){})}),this.$element.attr({"aria-hidden":!1}).attr("tabindex",-1).focus().trigger("open.zf.reveal"),e("body").addClass("is-reveal-open").attr({"aria-hidden":this.options.overlay||this.options.fullScreen?!0:!1}),setTimeout(function(){i._extraHandlers()},0)},i.prototype._extraHandlers=function(){var i=this;this.focusableElements=t.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||e("body").on("click.zf.reveal",function(t){i.close()}),this.options.closeOnEsc&&e(window).on("keydown.zf.reveal",function(e){t.Keyboard.handleKey(e,"Reveal",{close:function(){i.options.closeOnEsc&&(i.close(),i.$anchor.focus())}}),0===i.focusableElements.length&&e.preventDefault()}),this.$element.on("keydown.zf.reveal",function(n){var s=e(this);t.Keyboard.handleKey(n,"Reveal",{tab_forward:function(){i.$element.find(":focus").is(i.focusableElements.eq(-1))&&(i.focusableElements.eq(0).focus(),n.preventDefault())},tab_backward:function(){(i.$element.find(":focus").is(i.focusableElements.eq(0))||i.$element.is(":focus"))&&(i.focusableElements.eq(-1).focus(),n.preventDefault())},open:function(){i.$element.find(":focus").is(i.$element.find("[data-close]"))?setTimeout(function(){i.$anchor.focus()},1):s.is(i.focusableElements)&&i.open()},close:function(){i.options.closeOnEsc&&(i.close(),i.$anchor.focus())}})})},i.prototype.close=function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var i=this;this.options.animationOut?t.Motion.animateOut(this.$element,this.options.animationOut,function(){i.options.overlay&&t.Motion.animateOut(i.$overlay,"fade-out",function(){})}):this.$element.hide(i.options.hideDelay,function(){i.options.overlay&&i.$overlay.hide(0,function(){})}),this.options.closeOnEsc&&e(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&e("body").off("click.zf.reveal"),this.$element.off("keydown.zf.reveal"),this.changedSize&&this.$element.css({height:"",width:""}),e("body").removeClass("is-reveal-open").attr({"aria-hidden":!1,tabindex:""}),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,this.$element.attr({"aria-hidden":!0}).trigger("closed.zf.reveal")},i.prototype.toggle=function(){this.isActive?this.close():this.open()},i.prototype.destroy=function(){this.options.overlay&&this.$overlay.hide().off().remove(),this.$element.hide(),this.$anchor.off(),t.unregisterPlugin(this)},t.plugin(i,"Reveal"),"undefined"!=typeof module&&"undefined"!=typeof module.exports&&(module.exports=i),"function"==typeof define&&define(["foundation"],function(){return i})}(Foundation,jQuery),!function(t,e){"use strict";function i(n,s){this.$element=n,this.options=t.extend({},i.defaults,this.$element.data(),s),this._init(),e.registerPlugin(this,"Slider"),e.Keyboard.register("Slider",{ltr:{ARROW_RIGHT:"increase",ARROW_UP:"increase",ARROW_DOWN:"decrease",ARROW_LEFT:"decrease",SHIFT_ARROW_RIGHT:"increase_fast",SHIFT_ARROW_UP:"increase_fast",SHIFT_ARROW_DOWN:"decrease_fast",SHIFT_ARROW_LEFT:"decrease_fast"},rtl:{ARROW_LEFT:"increase",ARROW_RIGHT:"decrease",SHIFT_ARROW_LEFT:"increase_fast",SHIFT_ARROW_RIGHT:"decrease_fast"}})}function n(t,e){return t/e}function s(t,e,i,n){return Math.abs(t.position()[e]+t[n]()/2-i)}i.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled"},i.prototype._init=function(){this.inputs=this.$element.find("input"),this.handles=this.$element.find("[data-slider-handle]"),this.$handle=this.handles.eq(0),this.$input=this.inputs.length?this.inputs.eq(0):t("#"+this.$handle.attr("aria-controls")),this.$fill=this.$element.find("[data-slider-fill]").css(this.options.vertical?"height":"width",0);var e=!1,i=this;(this.options.disabled||this.$element.hasClass(this.options.disabledClass))&&(this.options.disabled=!0,this.$element.addClass(this.options.disabledClass)),this.inputs.length||(this.inputs=t().add(this.$input),this.options.binding=!0),this._setInitAttr(0),this._events(this.$handle),this.handles[1]&&(this.options.doubleSided=!0,this.$handle2=this.handles.eq(1),this.$input2=this.inputs.length>1?this.inputs.eq(1):t("#"+this.$handle2.attr("aria-controls")),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),e=!0,this._setHandlePos(this.$handle,this.options.initialStart,!0,function(){i._setHandlePos(i.$handle2,i.options.initialEnd)}),this._setInitAttr(1),this._events(this.$handle2)),e||this._setHandlePos(this.$handle,this.options.initialStart,!0)},i.prototype._setHandlePos=function(t,i,s,o){i=parseFloat(i),ithis.options.end&&(i=this.options.end);var a=this.options.doubleSided;if(a)if(0===this.handles.index(t)){var r=parseFloat(this.$handle2.attr("aria-valuenow"));i=i>=r?r-this.options.step:i}else{var l=parseFloat(this.$handle.attr("aria-valuenow"));i=l>=i?l+this.options.step:i}this.options.vertical&&!s&&(i=this.options.end-i);var d=this,h=this.options.vertical,u=h?"height":"width",f=h?"top":"left",c=t[0].getBoundingClientRect()[u]/2,p=this.$element[0].getBoundingClientRect()[u],m=n(i,this.options.end).toFixed(2),g=(p-c)*m,v=(100*n(g,p)).toFixed(this.options.decimal),i=i>0?parseFloat(i.toFixed(this.options.decimal)):0,w={};if(this._setValues(t,i),this.options.doubleSided){var y,$=0===this.handles.index(t);this.handles.index(t);if($)w[f]=(m>0?100*m:0)+"%",y=(100*(n(this.$handle2.position()[f]+c,p)-parseFloat(m))).toFixed(this.options.decimal)+"%",w["min-"+u]=y,o&&"function"==typeof o&&o();else{var b=parseFloat(this.$handle[0].style.left);i=(100>i?i:100)-(isNaN(b)?this.options.end-i:b),w["min-"+u]=i+"%"}}this.$element.one("finished.zf.animate",function(){d.animComplete=!0,d.$element.trigger("moved.zf.slider",[t])});var C=d.$element.data("dragging")?1e3/60:d.options.moveTime;e.Move(C,t,function(){t.css(f,v+"%"),d.options.doubleSided?d.$fill.css(w):d.$fill.css(u,100*m+"%")})},i.prototype._setInitAttr=function(t){var i=this.inputs.eq(t).attr("id")||e.GetYoDigits(6,"slider");this.inputs.eq(t).attr({id:i,max:this.options.end,min:this.options.start}),this.handles.eq(t).attr({role:"slider","aria-controls":i,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":0===t?this.options.initialStart:this.options.initialEnd,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})},i.prototype._setValues=function(t,e){var i=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(i).val(e),t.attr("aria-valuenow",e)},i.prototype._handleEvent=function(t,e,i){var o,a;if(i)o=i,a=!0;else{t.preventDefault();var r=this.options.vertical,l=r?"height":"width",d=r?"top":"left",h=r?t.pageY:t.pageX,u=this.$handle[0].getBoundingClientRect()[l]/2,f=this.$element[0].getBoundingClientRect()[l],c=this.$element.offset()[d]-h,p=c>0?-u:-f>c-u?f:Math.abs(c),m=n(p,f);if(o=(this.options.end-this.options.start)*m,a=!1,!e){var g=s(this.$handle,d,p,l),v=s(this.$handle2,d,p,l);e=v>=g?this.$handle:this.$handle2}}this._setHandlePos(e,o,a)},i.prototype._events=function(i){if(this.options.disabled)return!1;var n,s=this;if(this.inputs.off("change.zf.slider").on("change.zf.slider",function(e){var i=s.inputs.index(t(this));s._handleEvent(e,s.handles.eq(i),t(this).val())}),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",function(t){return s.$element.data("dragging")?!1:(s.animComplete=!1,void(s.options.doubleSided?s._handleEvent(t):s._handleEvent(t,s.$handle)))}),this.options.draggable){this.handles.addTouch();var o=t("body");i.off("mousedown.zf.slider").on("mousedown.zf.slider",function(e){i.addClass("is-dragging"),s.$fill.addClass("is-dragging"),s.$element.data("dragging",!0),s.animComplete=!1,n=t(e.currentTarget),o.on("mousemove.zf.slider",function(t){t.preventDefault(),s._handleEvent(t,n)}).on("mouseup.zf.slider",function(t){s.animComplete=!0,s._handleEvent(t,n),i.removeClass("is-dragging"),s.$fill.removeClass("is-dragging"),s.$element.data("dragging",!1),o.off("mousemove.zf.slider mouseup.zf.slider")})})}i.off("keydown.zf.slider").on("keydown.zf.slider",function(i){var n,o=s.options.doubleSided?s.handles.index(t(this)):0,a=parseFloat(s.inputs.eq(o).val()),r=t(this);e.Keyboard.handleKey(i,"Slider",{decrease:function(){n=a-s.options.step},increase:function(){n=a+s.options.step},decrease_fast:function(){n=a-10*s.options.step},increase_fast:function(){n=a+10*s.options.step},handled:function(){i.preventDefault(),s._setHandlePos(r,n,!0)}})})},i.prototype.destroy=function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),e.unregisterPlugin(this)},e.plugin(i,"Slider")}(jQuery,window.Foundation),!function(t,e){"use strict";function i(n,s){this.$element=n,this.options=t.extend({},i.defaults,this.$element.data(),s),this._init(),e.registerPlugin(this,"Sticky")}function n(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}i.defaults={container:"
    ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",checkEvery:-1},i.prototype._init=function(){var i=this.$element.parent("[data-sticky-container]"),n=this.$element[0].id||e.GetYoDigits(6,"sticky"),s=this;i.length||(this.wasWrapped=!0),this.$container=i.length?i:t(this.options.container).wrapInner(this.$element),this.$container.addClass(this.options.containerClass),this.$element.addClass(this.options.stickyClass).attr({"data-resize":n}),this.scrollCount=this.options.checkEvery,this.isStuck=!1,""!==this.options.anchor?this.$anchor=t("#"+this.options.anchor):this._parsePoints(),this._setSizes(function(){s._calc(!1)}),this._events(n.split("-").reverse().join("-"))},i.prototype._parsePoints=function(){var e=this.options.topAnchor,i=this.options.btmAnchor,n=[e,i],s={};if(e&&i)for(var o=0,a=n.length;a>o&&n[o];o++){var r;if("number"==typeof n[o])r=n[o];else{var l=n[o].split(":"),d=t("#"+l[0]);r=d.offset().top,l[1]&&"bottom"===l[1].toLowerCase()&&(r+=d[0].getBoundingClientRect().height)}s[o]=r}else s={0:1,1:document.documentElement.scrollHeight};this.points=s},i.prototype._events=function(e){var i=this,n=this.scrollListener="scroll.zf."+e;this.isOn||(this.canStick&&(this.isOn=!0,t(window).off(n).on(n,function(t){0===i.scrollCount?(i.scrollCount=i.options.checkEvery,i._setSizes(function(){i._calc(!1,window.pageYOffset)})):(i.scrollCount--,i._calc(!1,window.pageYOffset))})),this.$element.off("resizeme.zf.trigger").on("resizeme.zf.trigger",function(t,s){i._setSizes(function(){i._calc(!1),i.canStick?i.isOn||i._events(e):i.isOn&&i._pauseListeners(n)})}))},i.prototype._pauseListeners=function(e){this.isOn=!1,t(window).off(e),this.$element.trigger("pause.zf.sticky")},i.prototype._calc=function(t,e){return t&&this._setSizes(),this.canStick?(e||(e=window.pageYOffset),void(e>=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0))):(this.isStuck&&this._removeSticky(!0),!1)},i.prototype._setSticky=function(){var t=this.options.stickTo,e="top"===t?"marginTop":"marginBottom",i="top"===t?"bottom":"top",n={};n[e]=this.options[e]+"em",n[t]=0,n[i]="auto",n.left=this.$container.offset().left+parseInt(window.getComputedStyle(this.$container[0])["padding-left"],10),this.isStuck=!0,this.$element.removeClass("is-anchored is-at-"+i).addClass("is-stuck is-at-"+t).css(n).trigger("sticky.zf.stuckto:"+t)},i.prototype._removeSticky=function(t){var e=this.options.stickTo,i="top"===e,n={},s=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,o=i?"marginTop":"marginBottom",a=i?"bottom":"top",r=t?"top":"bottom";n[o]=0,t&&!i||i&&!t?(n[e]=s,n[a]=0):(n[e]=0,n[a]=s),n.left="",this.isStuck=!1,this.$element.removeClass("is-stuck is-at-"+e).addClass("is-anchored is-at-"+r).css(n).trigger("sticky.zf.unstuckfrom:"+r)},i.prototype._setSizes=function(t){this.canStick=e.MediaQuery.atLeast(this.options.stickyOn),this.canStick||t();var i=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),s=parseInt(n["padding-right"],10);this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":i-s+"px"});var o=this.$element[0].getBoundingClientRect().height||this.containerHeight;this.containerHeight=o,this.$container.css({height:o}),this.elemHeight=o,this.isStuck&&this.$element.css({left:this.$container.offset().left+parseInt(n["padding-left"],10)}),this._setBreakPoints(o,function(){t&&t()})},i.prototype._setBreakPoints=function(t,e){if(!this.canStick){if(!e)return!1;e()}var i=n(this.options.marginTop),s=n(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,a=this.points?this.points[1]:o+this.anchorHeight,r=window.innerHeight;"top"===this.options.stickTo?(o-=i,a-=t+i):"bottom"===this.options.stickTo&&(o-=r-(t+s),a-=r-s),this.topPoint=o,this.bottomPoint=a,e&&e()},i.prototype.destroy=function(){this._removeSticky(!0),this.$element.removeClass(this.options.stickyClass+" is-anchored is-at-top").css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger"),this.$anchor.off("change.zf.sticky"),t(window).off(this.scrollListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""}),e.unregisterPlugin(this)},e.plugin(i,"Sticky")}(jQuery,window.Foundation),!function(t,e){"use strict";function i(n,s){this.$element=n,this.options=t.extend({},i.defaults,this.$element.data(),s),this._init(),e.registerPlugin(this,"Tabs"),e.Keyboard.register("Tabs",{ENTER:"open",SPACE:"open",ARROW_RIGHT:"next",ARROW_UP:"previous",ARROW_DOWN:"next",ARROW_LEFT:"previous"})}i.defaults={autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,linkClass:"tabs-title",panelClass:"tabs-panel"},i.prototype._init=function(){var i=this;if(this.$tabTitles=this.$element.find("."+this.options.linkClass),this.$tabContent=t('[data-tabs-content="'+this.$element[0].id+'"]'),this.$tabTitles.each(function(){var e=t(this),n=e.find("a"),s=e.hasClass("is-active"),o=n.attr("href").slice(1),a=o+"-label",r=t(o);e.attr({role:"presentation"}),n.attr({role:"tab","aria-controls":o,"aria-selected":s,id:a}),r.attr({role:"tabpanel","aria-hidden":!s,"aria-labelledby":a}),s&&i.options.autoFocus&&n.focus()}),this.options.matchHeight){var n=this.$tabContent.find("img");n.length?e.onImagesLoaded(n,this._setHeight.bind(this)):this._setHeight()}this._events()},i.prototype._events=function(){this._addKeyHandler(),this._addClickHandler(),this.options.matchHeight&&t(window).on("changed.zf.mediaquery",this._setHeight.bind(this))},i.prototype._addClickHandler=function(){var e=this;this.$element.off("click.zf.tabs").on("click.zf.tabs","."+this.options.linkClass,function(i){i.preventDefault(),i.stopPropagation(),t(this).hasClass("is-active")||e._handleTabChange(t(this))})},i.prototype._addKeyHandler=function(){var i=this;i.$element.find("li:first-of-type"),i.$element.find("li:last-of-type");this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",function(n){if(9!==n.which){n.stopPropagation(),n.preventDefault();var s,o,a=t(this),r=a.parent("ul").children("li");r.each(function(e){return t(this).is(a)?void(i.options.wrapOnKeys?(s=0===e?r.last():r.eq(e-1),o=e===r.length-1?r.first():r.eq(e+1)):(s=r.eq(Math.max(0,e-1)),o=r.eq(Math.min(e+1,r.length-1)))):void 0}),e.Keyboard.handleKey(n,"Tabs",{open:function(){a.find('[role="tab"]').focus(),i._handleTabChange(a)},previous:function(){s.find('[role="tab"]').focus(),i._handleTabChange(s)},next:function(){o.find('[role="tab"]').focus(),i._handleTabChange(o)}})}})},i.prototype._handleTabChange=function(e){var i=e.find('[role="tab"]'),n=i.attr("href"),s=t(n),o=this.$element.find("."+this.options.linkClass+".is-active").removeClass("is-active").find('[role="tab"]').attr({"aria-selected":"false"}).attr("href");t(o).removeClass("is-active").attr({"aria-hidden":"true"}),e.addClass("is-active"),i.attr({"aria-selected":"true"}),s.addClass("is-active").attr({"aria-hidden":"false"}),this.$element.trigger("change.zf.tabs",[e])},i.prototype.selectTab=function(t){var e;e="object"==typeof t?t[0].id:t,e.indexOf("#")<0&&(e="#"+e);var i=this.$tabTitles.find('[href="'+e+'"]').parent("."+this.options.linkClass);this._handleTabChange(i)},i.prototype._setHeight=function(){var e=0;this.$tabContent.find("."+this.options.panelClass).css("height","").each(function(){var i=t(this),n=i.hasClass("is-active");n||i.css({visibility:"hidden",display:"block"});var s=this.getBoundingClientRect().height;n||i.css({visibility:"",display:""}),e=s>e?s:e}).css("height",e+"px")},i.prototype.destroy=function(){this.$element.find("."+this.options.linkClass).off(".zf.tabs").hide().end().find("."+this.options.panelClass).hide(),this.options.matchHeight&&t(window).off("changed.zf.mediaquery"),e.unregisterPlugin(this)},e.plugin(i,"Tabs")}(jQuery,window.Foundation),!function(t,e){"use strict";function i(n,s){this.$element=n,this.options=e.extend({},i.defaults,n.data(),s),this.className="",this._init(),this._events(),t.registerPlugin(this,"Toggler")}i.defaults={animate:!1},i.prototype._init=function(){var t;this.options.animate?(t=this.options.animate.split(" "),this.animationIn=t[0],this.animationOut=t[1]||null):(t=this.$element.data("toggler"),this.className="."===t[0]?t.slice(1):t);var i=this.$element[0].id;e('[data-open="'+i+'"], [data-close="'+i+'"], [data-toggle="'+i+'"]').attr("aria-controls",i),this.$element.attr("aria-expanded",this.$element.is(":hidden")?!1:!0)},i.prototype._events=function(){this.$element.off("toggle.zf.trigger").on("toggle.zf.trigger",this.toggle.bind(this))},i.prototype.toggle=function(){this[this.options.animate?"_toggleAnimate":"_toggleClass"]()},i.prototype._toggleClass=function(){this.$element.toggleClass(this.className);var t=this.$element.hasClass(this.className);t?this.$element.trigger("on.zf.toggler"):this.$element.trigger("off.zf.toggler"),this._updateARIA(t)},i.prototype._toggleAnimate=function(){var e=this;this.$element.is(":hidden")?t.Motion.animateIn(this.$element,this.animationIn,function(){this.trigger("on.zf.toggler"),e._updateARIA(!0)}):t.Motion.animateOut(this.$element,this.animationOut,function(){this.trigger("off.zf.toggler"),e._updateARIA(!1)})},i.prototype._updateARIA=function(t){this.$element.attr("aria-expanded",t?!0:!1)},i.prototype.destroy=function(){this.$element.off(".zf.toggler"),t.unregisterPlugin(this)},t.plugin(i,"Toggler"),"undefined"!=typeof module&&"undefined"!=typeof module.exports&&(module.exports=i),"function"==typeof define&&define(["foundation"],function(){return i})}(Foundation,jQuery),!function(t,e,i){"use strict";function n(e,s){this.$element=e,this.options=t.extend({},n.defaults,this.$element.data(),s),this.isActive=!1,this.isClick=!1,this._init(),i.registerPlugin(this,"Tooltip")}n.defaults={disableForTouch:!1,hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,positionClass:"",vOffset:10,hOffset:12},n.prototype._init=function(){var n=this.$element.attr("aria-describedby")||i.GetYoDigits(6,"tooltip");this.options.positionClass=this._getPositionClass(this.$element),this.options.tipText=this.options.tipText||this.$element.attr("title"),this.template=this.options.template?t(this.options.template):this._buildTemplate(n),this.template.appendTo(e.body).text(this.options.tipText).hide(),this.$element.attr({title:"","aria-describedby":n,"data-yeti-box":n,"data-toggle":n,"data-resize":n}).addClass(this.triggerClass),this.usedPositions=[],this.counter=4,this.classChanged=!1,this._events()},n.prototype._getPositionClass=function(t){if(!t)return"";var e=t[0].className.match(/(top|left|right)/g);return e=e?e[0]:""},n.prototype._buildTemplate=function(e){var i=(this.options.tooltipClass+" "+this.options.positionClass).trim(),n=t("
    ").addClass(i).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:e});return n},n.prototype._reposition=function(t){this.usedPositions.push(t?t:"bottom"),!t&&this.usedPositions.indexOf("top")<0?this.template.addClass("top"):"top"===t&&this.usedPositions.indexOf("bottom")<0?this.template.removeClass(t):"left"===t&&this.usedPositions.indexOf("right")<0?this.template.removeClass(t).addClass("right"):"right"===t&&this.usedPositions.indexOf("left")<0?this.template.removeClass(t).addClass("left"):!t&&this.usedPositions.indexOf("top")>-1&&this.usedPositions.indexOf("left")<0?this.template.addClass("left"):"top"===t&&this.usedPositions.indexOf("bottom")>-1&&this.usedPositions.indexOf("left")<0?this.template.removeClass(t).addClass("left"):"left"===t&&this.usedPositions.indexOf("right")>-1&&this.usedPositions.indexOf("bottom")<0?this.template.removeClass(t):"right"===t&&this.usedPositions.indexOf("left")>-1&&this.usedPositions.indexOf("bottom")<0?this.template.removeClass(t):this.template.removeClass(t),this.classChanged=!0,this.counter--},n.prototype._setPosition=function(){var t=this._getPositionClass(this.template),e=i.Box.GetDimensions(this.template),n=i.Box.GetDimensions(this.$element),s="left"===t?"left":"right"===t?"left":"top",o="top"===s?"height":"width";"height"===o?this.options.vOffset:this.options.hOffset;if(e.width>=e.windowDims.width||!this.counter&&!i.Box.ImNotTouchingYou(this.template))return this.template.offset(i.Box.GetOffsets(this.template,this.$element,"center bottom",this.options.vOffset,this.options.hOffset,!0)).css({width:n.windowDims.width-2*this.options.hOffset,height:"auto"}),!1;for(this.template.offset(i.Box.GetOffsets(this.template,this.$element,"center "+(t||"bottom"),this.options.vOffset,this.options.hOffset));!i.Box.ImNotTouchingYou(this.template)&&this.counter;)this._reposition(t),this._setPosition()},n.prototype.show=function(){if("all"!==this.options.showOn&&!i.MediaQuery.atLeast(this.options.showOn))return!1;var t=this;this.template.css("visibility","hidden").show(),this._setPosition(),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),t.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,function(){}),this.$element.trigger("show.zf.tooltip")},n.prototype.hide=function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,function(){t.isActive=!1,t.isClick=!1,t.classChanged&&(t.template.removeClass(t._getPositionClass(t.template)).addClass(t.options.positionClass),t.usedPositions=[],t.counter=4,t.classChanged=!1)}),this.$element.trigger("hide.zf.tooltip")},n.prototype._events=function(){var t=this,e=(this.template,!1);this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",function(e){t.isActive||(t.timeout=setTimeout(function(){t.show()},t.options.hoverDelay))}).on("mouseleave.zf.tooltip",function(i){clearTimeout(t.timeout),(!e||!t.isClick&&t.options.clickOpen)&&t.hide()}),this.options.clickOpen&&this.$element.on("mousedown.zf.tooltip",function(e){e.stopImmediatePropagation(),t.isClick?t.hide():(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())}),this.options.disableForTouch||this.$element.on("tap.zf.tooltip touchend.zf.tooltip",function(e){t.isActive?t.hide():t.show()}),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",function(i){return e=!0,t.isClick?!1:void t.show()}).on("focusout.zf.tooltip",function(i){e=!1,t.isClick=!1,t.hide()}).on("resizeme.zf.trigger",function(){t.isActive&&t._setPosition()})},n.prototype.toggle=function(){this.isActive?this.hide():this.show()},n.prototype.destroy=function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tootip").removeAttr("aria-describedby").removeAttr("data-yeti-box").removeAttr("data-toggle").removeAttr("data-resize"),this.template.remove(),i.unregisterPlugin(this)},i.plugin(n,"Tooltip")}(jQuery,window.document,window.Foundation); \ No newline at end of file diff --git a/templates/Binarity/Resources/assets/js/jquery.min.js b/templates/Binarity/Resources/assets/js/jquery.min.js deleted file mode 100644 index fad9ab12..00000000 --- a/templates/Binarity/Resources/assets/js/jquery.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){ -return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*\s*$/g,ia={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("