diff --git a/protected/humhub/docs/CHANGELOG_DEV.md b/protected/humhub/docs/CHANGELOG_DEV.md
index bd3607cf16..04f1c91b00 100644
--- a/protected/humhub/docs/CHANGELOG_DEV.md
+++ b/protected/humhub/docs/CHANGELOG_DEV.md
@@ -5,8 +5,6 @@ HumHub Change Log (DEVELOP)
1.4
---
-Warning: The minimum required PHP version is now 7.1
-
- Enh: GroupPermissionManager - allow to query users by given permission
- Enh: Automatic migrate DB collations from utf8 to utf8mb4
- Enh: Added Icon widget as wrapper class
@@ -41,3 +39,8 @@ Warning: The minimum required PHP version is now 7.1
- Enh: Added integrated page icon handling
- Enh: Updated to Yii 2.0.16
- Enh: Raised minimum PHP Version to 7.1
+- Chng: New Menu and MenuEntry rendering
+- Enh: Added Icon abstraction `humhub\modules\ui\icon\widgets\Icon`
+- Enh: Added `humhub\libs\Html::addPjaxPrevention()` for link options
+- Enh: Added obj support for `humhub\libs\Sort`
+- Enh: Reorganized WallEntry context menu
diff --git a/protected/humhub/docs/guide/developer/README.md b/protected/humhub/docs/guide/developer/README.md
index 510b7486f1..ea7ad4d221 100644
--- a/protected/humhub/docs/guide/developer/README.md
+++ b/protected/humhub/docs/guide/developer/README.md
@@ -31,6 +31,7 @@ Basic Concepts
* [Activities](activities.md)
* [File Handling](files.md)
* [Widgets](widgets.md)
+* [Menus and Navigations](menus.md)
* [Snippets](snippet.md)
* [Internationalization](i18n.md)
diff --git a/protected/humhub/docs/guide/developer/menus.md b/protected/humhub/docs/guide/developer/menus.md
new file mode 100644
index 0000000000..e56b315567
--- /dev/null
+++ b/protected/humhub/docs/guide/developer/menus.md
@@ -0,0 +1,109 @@
+Menus and Navigations
+=====================
+
+All menus and navigation widgets are derived from the widget class [[humhub\modules\ui\menu\widgets\Menu]].
+
+Additionally, there are following sub base classes with predefined templates available:
+
+- [[humhub\modules\ui\menu\widgets\LeftNavigation]]
+- [[humhub\modules\ui\menu\widgets\TabMenu]]
+- [[humhub\modules\ui\menu\widgets\SubTabMenu]]
+- [[humhub\modules\ui\menu\widgets\DropDownMenu]]
+
+
+Based on these base classes, following menu implementations are most frequently used:
+
+- TopMenu (Main navigation with entries like Dashboard/Directory) - [[humhub\widgets\TopMenu]]
+- FooterMenu - [[humhub\widgets\FooterMenu]]
+- AdminMenu - Administrative Section - [[humhub\modules\admin\widgets\AdminMenu]]
+- AccountMenu - [[humhub\modules\user\widgets\AccountTopMenu]]
+
+
+Menu entries are represented by the class [[humhub\modules\ui\menu\MenuEntry]].
+Instances of this class can be added via the menu class.
+
+See the [[humhub\modules\ui\menu\MenuEntry]] class for a full list of properties and options.
+
+
+Events
+------
+
+The menu allow you to manipulate menu entries at certain execution points using events.
+
+You can use all Yii2 widget events to interact with the menu class.
+
+
+Example of the modules **config.php**:
+
+```php
+return [
+ 'id' => 'example',
+ 'class' => Module::class,
+ 'events' => [
+ ['class' => TopMenu::class, 'event' => TopMenu::EVENT_INIT, 'callback' => ['\humhub\modules\example\Events', 'onTopMenuInit']],
+ ]
+];
+```
+
+
+Example of a callback:
+
+
+```php
+
+namespace humhub\modules\example;
+
+use humhub\modules\dashboard\widgets\ShareWidget;
+use humhub\modules\ui\widgets\Icon;
+use humhub\modules\ui\menu\MenuEntry;
+use humhub\widgets\TopMenu;
+
+use Yii;
+use yii\base\Event;
+use yii\helpers\Url;
+
+/**
+ * Description of Events
+ *
+ * @author luke
+ */
+class Events
+{
+
+ /**
+ * TopMenu init event callback
+ *
+ * @see TopMenu
+ * @param Event $event
+ */
+ public static function onTopMenuInit($event)
+ {
+ /** @var TopMenu $topMenu */
+ $topMenu = $event->sender;
+
+ $entry = new MenuEntry();
+
+ $entry->setId('dashboard');
+ $entry->setLabel(Yii::t('DashboardModule.base', 'Dashboard'));
+ $entry->setUrl(['/dashboard/dashboard']);
+ $entry->setIcon(new Icon(['name' => 'tachometer']));
+ $entry->setSortOrder(100);
+ $entry->setIsActive((Yii::$app->controller->module && Yii::$app->controller->module->id === 'dashboard'));
+
+ $topMenu->addEntry($entry);
+ }
+
+}
+
+
+```
+
+
+ToDos
+-----
+
+- Add UnitTesting
+- Allow submenus
+- Separator Entry support
+- Location for Footer/TopMenu sources? Move into UI module?
+- PanelMenu Cleanup
diff --git a/protected/humhub/libs/Html.php b/protected/humhub/libs/Html.php
index a41c4163b0..827044b8de 100644
--- a/protected/humhub/libs/Html.php
+++ b/protected/humhub/libs/Html.php
@@ -109,4 +109,9 @@ class Html extends \yii\bootstrap\Html
throw new InvalidArgumentException('Content container type not supported!');
}
}
+
+ public static function addPjaxPrevention(&$options)
+ {
+ $options['data-pjax-prevent'] = 1;
+ }
}
diff --git a/protected/humhub/libs/Sort.php b/protected/humhub/libs/Sort.php
index 6daaa8b4b6..97c41481a7 100644
--- a/protected/humhub/libs/Sort.php
+++ b/protected/humhub/libs/Sort.php
@@ -13,8 +13,8 @@ class Sort
public static function sort(&$arr, $field = 'sortOrder')
{
usort($arr, function($a, $b) use ($field) {
- $sortA = (isset($a[$field])) ? $a[$field] : PHP_INT_MAX;
- $sortB = (isset($b[$field])) ? $b[$field] : PHP_INT_MAX;
+ $sortA = static::getSortValue($a, $field);
+ $sortB = static::getSortValue($b, $field);
if ($sortA == $sortB) {
return 0;
@@ -27,4 +27,18 @@ class Sort
return $arr;
}
+
+ private static function getSortValue($obj, $field)
+ {
+ if(is_array($obj) && isset($obj[$field])) {
+ return $obj[$field];
+ }
+
+ if(property_exists($obj, $field)) {
+ return $obj->$field;
+ }
+
+ return PHP_INT_MAX;
+ }
+
}
diff --git a/protected/humhub/modules/admin/controllers/IndexController.php b/protected/humhub/modules/admin/controllers/IndexController.php
index 9d241fef1e..3148316a6a 100644
--- a/protected/humhub/modules/admin/controllers/IndexController.php
+++ b/protected/humhub/modules/admin/controllers/IndexController.php
@@ -8,8 +8,11 @@
namespace humhub\modules\admin\controllers;
+use humhub\modules\ui\menu\MenuLink;
use Yii;
use humhub\modules\admin\components\Controller;
+use humhub\modules\admin\widgets\AdminMenu;
+use yii\web\HttpException;
/**
* IndexController is the admin section start point.
@@ -39,9 +42,16 @@ class IndexController extends Controller
*/
public function actionIndex()
{
- $adminMenu = new \humhub\modules\admin\widgets\AdminMenu();
+ $adminMenu = new AdminMenu();
- return $this->redirect($adminMenu->items[0]['url']);
+ /* @var $firstVisible MenuLink */
+ $firstVisible = $adminMenu->getFirstEntry(MenuLink::class, true);
+
+ if(!$firstVisible) {
+ throw new HttpException(403);
+ }
+
+ return $this->redirect($firstVisible->getUrl());
}
}
diff --git a/protected/humhub/modules/admin/widgets/AdminMenu.php b/protected/humhub/modules/admin/widgets/AdminMenu.php
index 1b804beed1..86f47801fb 100644
--- a/protected/humhub/modules/admin/widgets/AdminMenu.php
+++ b/protected/humhub/modules/admin/widgets/AdminMenu.php
@@ -9,86 +9,91 @@
namespace humhub\modules\admin\widgets;
use Yii;
-use yii\helpers\Url;
+use humhub\modules\admin\permissions\ManageModules;
+use humhub\modules\admin\permissions\ManageSpaces;
+use humhub\modules\admin\permissions\SeeAdminInformation;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\ui\menu\widgets\LeftNavigation;
+use humhub\modules\admin\permissions\ManageUsers;
+use humhub\modules\admin\permissions\ManageSettings;
+use humhub\modules\admin\permissions\ManageGroups;
/**
- * Description of AdminMenu
+ * AdminMenu
*
* @author luke
*/
-class AdminMenu extends \humhub\widgets\BaseMenu
+class AdminMenu extends LeftNavigation
{
+ /**
+ * @inheritdoc
+ */
const SESSION_CAN_SEE_ADMIN_SECTION = 'user.canSeeAdminSection';
public $template = "@humhub/widgets/views/leftNavigation";
public $type = "adminNavigation";
public $id = "admin-menu";
+ /**
+ * @inheritdoc
+ */
public function init()
{
- $this->addItemGroup([
- 'id' => 'admin',
- 'label' => \Yii::t('AdminModule.widgets_AdminMenuWidget', 'Administration menu'),
- 'sortOrder' => 100,
- ]);
+ $this->panelTitle = Yii::t('AdminModule.widgets_AdminMenuWidget', 'Administration menu');
- $this->addItem([
- 'label' => \Yii::t('AdminModule.widgets_AdminMenuWidget', 'Users'),
- 'url' => Url::toRoute(['/admin/user']),
- 'icon' => '',
+ $this->addEntry(new MenuLink([
+ 'label' => Yii::t('AdminModule.widgets_AdminMenuWidget', 'Users'),
+ 'url' => ['/admin/user'],
+ 'icon' => 'user',
'sortOrder' => 200,
- 'isActive' => (\Yii::$app->controller->module && \Yii::$app->controller->module->id == 'admin' && (Yii::$app->controller->id == 'user' || Yii::$app->controller->id == 'group' || Yii::$app->controller->id == 'approval' || Yii::$app->controller->id == 'authentication' || Yii::$app->controller->id == 'user-profile' || Yii::$app->controller->id == 'pending-registrations')),
+ 'isActive' => MenuLink::isActiveState('admin', ['user', 'group', 'approval', 'authentication', 'user-profile', 'pending-registrations']),
'isVisible' => Yii::$app->user->can([
- new \humhub\modules\admin\permissions\ManageUsers(),
- new \humhub\modules\admin\permissions\ManageSettings(),
- new \humhub\modules\admin\permissions\ManageGroups()
- ]),
- ]);
+ ManageUsers::class,
+ ManageSettings::class,
+ ManageGroups::class
+ ])
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.widgets_AdminMenuWidget', 'Spaces'),
- 'id' => 'spaces',
- 'url' => Url::toRoute('/admin/space'),
- 'icon' => '',
+ 'url' => ['/admin/space'],
+ 'icon' => 'inbox',
'sortOrder' => 400,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'space'),
+ 'isActive' => MenuLink::isActiveState('admin', 'space'),
'isVisible' => Yii::$app->user->can([
- new \humhub\modules\admin\permissions\ManageSpaces(),
- new \humhub\modules\admin\permissions\ManageSettings(),
- ]),
- ]);
+ ManageSpaces::class,
+ ManageSettings::class
+ ])
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.widgets_AdminMenuWidget', 'Modules'),
- 'id' => 'modules',
- 'url' => Url::toRoute('/admin/module'),
- 'icon' => '',
+ 'url' => ['/admin/module'],
+ 'icon' => 'rocket',
'sortOrder' => 500,
- 'newItemCount' => 0,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'module'),
- 'isVisible' => Yii::$app->user->can(new \humhub\modules\admin\permissions\ManageModules())
- ]);
+ 'htmlOptions' => ['class' => 'modules'],
+ 'isActive' => MenuLink::isActiveState('admin', 'module'),
+ 'isVisible' => Yii::$app->user->can(ManageModules::class)
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.widgets_AdminMenuWidget', 'Settings'),
- 'url' => Url::toRoute('/admin/setting'),
- 'icon' => '',
+ 'url' => ['/admin/setting'],
+ 'icon' => 'gears',
'sortOrder' => 600,
- 'newItemCount' => 0,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'setting'),
- 'isVisible' => Yii::$app->user->can(new \humhub\modules\admin\permissions\ManageSettings())
- ]);
+ 'isActive' => MenuLink::isActiveState('admin', 'setting'),
+ 'isVisible' => Yii::$app->user->can(ManageSettings::class)
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.widgets_AdminMenuWidget', 'Information'),
- 'url' => Url::toRoute('/admin/information'),
- 'icon' => '',
- 'sortOrder' => 10000,
- 'newItemCount' => 0,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'information'),
- 'isVisible' => Yii::$app->user->can(new \humhub\modules\admin\permissions\SeeAdminInformation())
- ]);
+ 'url' => ['/admin/information'],
+ 'icon' => 'info-circle',
+ 'sortOrder' => 1000,
+ 'isActive' => MenuLink::isActiveState('admin', 'information'),
+ 'isVisible' => Yii::$app->user->can(SeeAdminInformation::class)
+ ]));
parent::init();
}
@@ -96,25 +101,15 @@ class AdminMenu extends \humhub\widgets\BaseMenu
/**
* @inheritdoc
*/
- public function run()
+ public function addItem($entryArray)
{
- // Workaround for modules with no admin menu permission support.
- if (!Yii::$app->user->isAdmin()) {
- foreach ($this->items as $key => $item) {
- if (!isset($item['isVisible'])) {
- unset($this->items[$key]);
- }
- }
+ $entry = MenuLink::createByArray($entryArray);
+
+ if(!isset($entryArray['isVisible'])) {
+ $entry->setIsVisible(Yii::$app->user->isAdmin());
}
- return parent::run();
- }
-
- public function addItem($item)
- {
- $item['group'] = 'admin';
-
- parent::addItem($item);
+ $this->addEntry($entry);
}
public static function canAccess()
@@ -125,7 +120,7 @@ class AdminMenu extends \humhub\widgets\BaseMenu
Yii::$app->session->set(static::SESSION_CAN_SEE_ADMIN_SECTION, $canSeeAdminSection);
}
- return $canSeeAdminSection;
+ return $canSeeAdminSection;
}
public static function reset()
@@ -135,14 +130,7 @@ class AdminMenu extends \humhub\widgets\BaseMenu
private static function checkNonAdminAccess()
{
- $adminMenu = new self();
- foreach($adminMenu->items as $item) {
- if(isset($item['isVisible']) && $item['isVisible']) {
- return true;
- }
- }
-
- return false;
+ return Yii::$app->user->can([ManageGroups::class, ManageModules::class, ManageSettings::class, ManageUsers::class, SeeAdminInformation::class]);
}
}
diff --git a/protected/humhub/modules/admin/widgets/AdvancedSettingMenu.php b/protected/humhub/modules/admin/widgets/AdvancedSettingMenu.php
index 0ee75c54d8..4b654b4e57 100644
--- a/protected/humhub/modules/admin/widgets/AdvancedSettingMenu.php
+++ b/protected/humhub/modules/admin/widgets/AdvancedSettingMenu.php
@@ -8,85 +8,84 @@
namespace humhub\modules\admin\widgets;
+use humhub\modules\ui\menu\MenuLink;
use Yii;
use yii\helpers\Url;
+use humhub\modules\ui\menu\widgets\SubTabMenu;
/**
* Authentication Settings Menu
*/
-class AdvancedSettingMenu extends \humhub\widgets\BaseMenu
+class AdvancedSettingMenu extends SubTabMenu
{
- /**
- * @inheritdoc
- */
- public $template = "@humhub/widgets/views/subTabMenu";
-
/**
* @inheritdoc
*/
public function init()
{
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.widgets_AdminMenuWidget', 'Caching'),
'url' => Url::toRoute(['/admin/setting/caching']),
- 'icon' => '',
+ 'icon' => 'dashboard',
'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'setting' && Yii::$app->controller->action->id == 'caching'),
+ 'isActive' => MenuLink::isActiveState('admin', 'setting', 'caching'),
'isVisible' => Yii::$app->user->isAdmin(),
- ]);
+ ]));
- $this->addItem([
- 'label' => Yii::t('AdminModule.widgets_AdminMenuWidget', 'Files'),
- 'url' => Url::toRoute('/admin/setting/file'),
- 'icon' => '',
- 'sortOrder' => 200,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'setting' && Yii::$app->controller->action->id == 'file'),
- 'isVisible' => Yii::$app->user->isAdmin(),
- ]);
+ $this->addEntry(new MenuLink([
+ 'label' => Yii::t('AdminModule.widgets_AdminMenuWidget', 'Files'),
+ 'url' => Url::toRoute('/admin/setting/file'),
+ 'icon' => 'file',
+ 'sortOrder' => 200,
+ 'isActive' => MenuLink::isActiveState('admin', 'setting', 'file'),
+ 'isVisible' => Yii::$app->user->isAdmin(),
+ ]));
- $this->addItem([
- 'label' => Yii::t('AdminModule.views_setting_mailing', 'E-Mail'),
- 'url' => Url::toRoute(['/admin/setting/mailing-server']),
- 'icon' => '',
- 'sortOrder' => 250,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'setting' && Yii::$app->controller->action->id == 'mailing-server'),
- ]);
+ $this->addEntry(new MenuLink([
+ 'label' => Yii::t('AdminModule.views_setting_mailing', 'E-Mail'),
+ 'url' => Url::toRoute(['/admin/setting/mailing-server']),
+ 'icon' => 'envelope',
+ 'sortOrder' => 250,
+ 'isActive' => MenuLink::isActiveState('admin', 'setting', 'mailing-server'),
+ 'isVisible' => Yii::$app->user->isAdmin(),
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.widgets_AdminMenuWidget', 'Proxy'),
'url' => Url::toRoute('/admin/setting/proxy'),
- 'icon' => '',
+ 'icon' => 'sitemap',
'sortOrder' => 300,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'setting' && Yii::$app->controller->action->id == 'proxy'),
+ 'isActive' => MenuLink::isActiveState('admin', 'setting', 'proxy'),
'isVisible' => Yii::$app->user->isAdmin(),
- ]);
- $this->addItem([
+ ]));
+
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.widgets_AdminMenuWidget', 'Statistics'),
'url' => Url::toRoute('/admin/setting/statistic'),
- 'icon' => '',
+ 'icon' => 'bar-chart-o',
'sortOrder' => 400,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'setting' && Yii::$app->controller->action->id == 'statistic'),
+ 'isActive' => MenuLink::isActiveState('admin', 'setting', 'statistic'),
'isVisible' => Yii::$app->user->isAdmin(),
- ]);
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.widgets_AdminMenuWidget', 'OEmbed'),
'url' => Url::toRoute('/admin/setting/oembed'),
- 'icon' => '',
+ 'icon' => 'cloud',
'sortOrder' => 500,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'setting' && (Yii::$app->controller->action->id == 'oembed' || Yii::$app->controller->action->id == 'oembed-edit')),
+ 'isActive' => MenuLink::isActiveState('admin', 'setting', 'oembed-edit'),
'isVisible' => Yii::$app->user->isAdmin(),
- ]);
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.widgets_AdminMenuWidget', 'Logs'),
'url' => Url::toRoute('/admin/setting/logs'),
- 'icon' => '',
+ 'icon' => 'terminal',
'sortOrder' => 600,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'setting' && (Yii::$app->controller->action->id == 'logs' || Yii::$app->controller->action->id == 'logs-edit')),
+ 'isActive' => MenuLink::isActiveState('admin', 'setting', ['logs', 'logs-edit']),
'isVisible' => Yii::$app->user->isAdmin(),
- ]);
+ ]));
parent::init();
}
diff --git a/protected/humhub/modules/admin/widgets/AuthenticationMenu.php b/protected/humhub/modules/admin/widgets/AuthenticationMenu.php
index 9fd4dc62be..16ef7ebcbe 100644
--- a/protected/humhub/modules/admin/widgets/AuthenticationMenu.php
+++ b/protected/humhub/modules/admin/widgets/AuthenticationMenu.php
@@ -8,31 +8,28 @@
namespace humhub\modules\admin\widgets;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\ui\menu\widgets\SubTabMenu;
use Yii;
use yii\helpers\Url;
/**
* Authentication Settings Menu
*/
-class AuthenticationMenu extends \humhub\widgets\BaseMenu
+class AuthenticationMenu extends SubTabMenu
{
- /**
- * @inheritdoc
- */
- public $template = "@humhub/widgets/views/subTabMenu";
-
/**
* @inheritdoc
*/
public function init()
{
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.setting', 'General'),
- 'url' => Url::toRoute(['/admin/authentication']),
+ 'url' => ['/admin/authentication'],
'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'authentication' && Yii::$app->controller->action->id == 'index'),
- ]);
+ 'isActive' => MenuLink::isActiveState('admin', 'authentication', 'index'),
+ ]));
parent::init();
}
diff --git a/protected/humhub/modules/admin/widgets/GroupManagerMenu.php b/protected/humhub/modules/admin/widgets/GroupManagerMenu.php
index 1bde067cd3..ac50731024 100644
--- a/protected/humhub/modules/admin/widgets/GroupManagerMenu.php
+++ b/protected/humhub/modules/admin/widgets/GroupManagerMenu.php
@@ -9,19 +9,15 @@
namespace humhub\modules\admin\widgets;
use Yii;
-use yii\helpers\Url;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\ui\menu\widgets\SubTabMenu;
/**
* Group Administration Menu
*/
-class GroupManagerMenu extends \humhub\widgets\BaseMenu
+class GroupManagerMenu extends SubTabMenu
{
- /**
- * @inheritdoc
- */
- public $template = "@humhub/widgets/views/subTabMenu";
-
/**
* @var \humhub\modules\user\models\Group
*/
@@ -32,24 +28,27 @@ class GroupManagerMenu extends \humhub\widgets\BaseMenu
*/
public function init()
{
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.user', 'Settings'),
- 'url' => Url::toRoute(['/admin/group/edit', 'id' => $this->group->id]),
+ 'url' => ['/admin/group/edit', 'id' => $this->group->id],
'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'group' && Yii::$app->controller->action->id == 'edit'),
- ]);
- $this->addItem([
+ 'isActive' => MenuLink::isActiveState('admin', 'group', 'edit')
+ ]));
+
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.user', "Permissions"),
- 'url' => Url::toRoute(['/admin/group/manage-permissions', 'id' => $this->group->id]),
+ 'url' => ['/admin/group/manage-permissions', 'id' => $this->group->id],
'sortOrder' => 200,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'group' && Yii::$app->controller->action->id == 'manage-permissions'),
- ]);
- $this->addItem([
+ 'isActive' => MenuLink::isActiveState('admin', 'group', 'manage-permissions')
+ ]));
+
+
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.user', "Members"),
- 'url' => Url::toRoute(['/admin/group/manage-group-users', 'id' => $this->group->id]),
+ 'url' => ['/admin/group/manage-group-users', 'id' => $this->group->id],
'sortOrder' => 200,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'group' && Yii::$app->controller->action->id == 'manage-group-users'),
- ]);
+ 'isActive' => MenuLink::isActiveState('admin', 'group', 'manage-group-users')
+ ]));
parent::init();
}
diff --git a/protected/humhub/modules/admin/widgets/GroupMenu.php b/protected/humhub/modules/admin/widgets/GroupMenu.php
index cca3912097..45572210e1 100644
--- a/protected/humhub/modules/admin/widgets/GroupMenu.php
+++ b/protected/humhub/modules/admin/widgets/GroupMenu.php
@@ -8,38 +8,28 @@
namespace humhub\modules\admin\widgets;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\ui\menu\widgets\SubTabMenu;
use Yii;
use yii\helpers\Url;
/**
* Group Administration Menu
*/
-class GroupMenu extends \humhub\widgets\BaseMenu
+class GroupMenu extends SubTabMenu
{
-
/**
* @inheritdoc
*/
- public $template = "@humhub/widgets/views/subTabMenu";
-
public function init()
{
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.views_user_index', 'Overview'),
- 'url' => Url::toRoute(['/admin/group/index']),
+ 'url' => ['/admin/group/index'],
'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'group' && Yii::$app->controller->action->id == 'index'),
- ]);
-
+ 'isActive' => MenuLink::isActiveState('admin', 'group', 'index'),
+ ]));
parent::init();
}
- public function run()
- {
- if(count($this->getItemGroups()) > 1) {
- return parent::run();
- }
- return '';
- }
-
}
diff --git a/protected/humhub/modules/admin/widgets/InformationMenu.php b/protected/humhub/modules/admin/widgets/InformationMenu.php
index 2bef73629b..4c3cd7bcf8 100644
--- a/protected/humhub/modules/admin/widgets/InformationMenu.php
+++ b/protected/humhub/modules/admin/widgets/InformationMenu.php
@@ -9,55 +9,55 @@
namespace humhub\modules\admin\widgets;
use Yii;
-use yii\helpers\Url;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\ui\menu\widgets\TabMenu;
+
/**
* Group Administration Menu
*/
-class InformationMenu extends \humhub\widgets\BaseMenu
+class InformationMenu extends TabMenu
{
/**
* @inheritdoc
*/
- public $template = "@humhub/widgets/views/tabMenu";
-
public function init()
{
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.information', 'About HumHub'),
- 'url' => Url::to(['/admin/information/about']),
+ 'url' => ['/admin/information/about'],
'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'information' && Yii::$app->controller->action->id == 'about'),
- ]);
+ 'isActive' => MenuLink::isActiveState('admin', 'information', 'about')
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.information', 'Prerequisites'),
- 'url' => Url::to(['/admin/information/prerequisites']),
+ 'url' => ['/admin/information/prerequisites'],
'sortOrder' => 200,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'information' && Yii::$app->controller->action->id == 'prerequisites'),
- ]);
+ 'isActive' => MenuLink::isActiveState('admin', 'information', 'prerequisites')
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.information', 'Database'),
- 'url' => Url::to(['/admin/information/database']),
+ 'url' => ['/admin/information/database'],
'sortOrder' => 300,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'information' && Yii::$app->controller->action->id == 'database'),
- ]);
+ 'isActive' => MenuLink::isActiveState('admin', 'information', 'database')
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.information', 'Background Jobs'),
- 'url' => Url::to(['/admin/information/background-jobs']),
+ 'url' => ['/admin/information/background-jobs'],
'sortOrder' => 400,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'information' && Yii::$app->controller->action->id == 'background-jobs'),
- ]);
+ 'isActive' => MenuLink::isActiveState('admin', 'information', 'background-jobs')
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.information', 'Logging'),
- 'url' => Url::toRoute(['/admin/logging']),
+ 'url' => ['/admin/logging'],
'sortOrder' => 500,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'logging'),
- ]);
+ 'isActive' => MenuLink::isActiveState('admin', 'logging')
+ ]));
parent::init();
}
diff --git a/protected/humhub/modules/admin/widgets/SettingsMenu.php b/protected/humhub/modules/admin/widgets/SettingsMenu.php
index fef7ba2784..9dcc738557 100644
--- a/protected/humhub/modules/admin/widgets/SettingsMenu.php
+++ b/protected/humhub/modules/admin/widgets/SettingsMenu.php
@@ -9,61 +9,61 @@
namespace humhub\modules\admin\widgets;
use Yii;
-use yii\helpers\Url;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\ui\menu\widgets\TabMenu;
+use humhub\modules\admin\permissions\ManageSettings;
/**
* Group Administration Menu
*/
-class SettingsMenu extends \humhub\widgets\BaseMenu
+class SettingsMenu extends TabMenu
{
/**
* @inheritdoc
*/
- public $template = "@humhub/widgets/views/tabMenu";
-
public function init()
{
- $canEditSettings = Yii::$app->user->can(new \humhub\modules\admin\permissions\ManageSettings());
+ $canEditSettings = Yii::$app->user->can(ManageSettings::class);
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.widgets_AdminMenuWidget', 'General'),
- 'url' => Url::toRoute('/admin/setting/index'),
+ 'url' => ['/admin/setting/index'],
'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'setting' && Yii::$app->controller->action->id == 'basic'),
+ 'isActive' => MenuLink::isActiveState('admin', 'setting', 'basic'),
'isVisible' => $canEditSettings
- ]);
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.widgets_AdminMenuWidget', 'Appearance'),
- 'url' => Url::toRoute('/admin/setting/design'),
+ 'url' => ['/admin/setting/design'],
'sortOrder' => 200,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'setting' && Yii::$app->controller->action->id == 'design'),
+ 'isActive' => MenuLink::isActiveState('admin', 'setting', 'design'),
'isVisible' => $canEditSettings
- ]);
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.widgets_AdminMenuWidget', 'E-Mail summaries'),
- 'url' => Url::toRoute('/activity/admin/defaults'),
+ 'url' => ['/activity/admin/defaults'],
'sortOrder' => 300,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'activity' && Yii::$app->controller->id == 'admin' && (Yii::$app->controller->action->id == 'defaults')),
+ 'isActive' => MenuLink::isActiveState('activity', 'admin', 'defaults'),
'isVisible' => $canEditSettings
- ]);
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.widgets_AdminMenuWidget', 'Notifications'),
- 'url' => Url::toRoute('/notification/admin/defaults'),
+ 'url' => ['/notification/admin/defaults'],
'sortOrder' => 400,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'notification' && Yii::$app->controller->id == 'admin' && (Yii::$app->controller->action->id == 'defaults')),
+ 'isActive' => MenuLink::isActiveState('notification', 'admin', 'defaults'),
'isVisible' => $canEditSettings
- ]);
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.widgets_AdminMenuWidget', 'Advanced'),
- 'url' => Url::toRoute('/admin/setting/advanced'),
+ 'url' => ['/admin/setting/advanced'],
'sortOrder' => 1000,
'isVisible' => $canEditSettings
- ]);
+ ]));
parent::init();
}
diff --git a/protected/humhub/modules/admin/widgets/SpaceMenu.php b/protected/humhub/modules/admin/widgets/SpaceMenu.php
index cf4e7e993e..fa853f8084 100644
--- a/protected/humhub/modules/admin/widgets/SpaceMenu.php
+++ b/protected/humhub/modules/admin/widgets/SpaceMenu.php
@@ -10,36 +10,39 @@ namespace humhub\modules\admin\widgets;
use Yii;
use yii\helpers\Url;
-use humhub\modules\admin\permissions\ManageSpaces;
+use humhub\modules\ui\menu\MenuLink;
use humhub\modules\admin\permissions\ManageSettings;
+use humhub\modules\admin\permissions\ManageSpaces;
+use humhub\modules\ui\menu\widgets\TabMenu;
/**
* Space Administration Menu
*
* @author Luke
*/
-class SpaceMenu extends \humhub\widgets\BaseMenu
+class SpaceMenu extends TabMenu
{
-
- public $template = "@humhub/widgets/views/tabMenu";
- public $type = "adminUserSubNavigation";
-
+ /**
+ * @inheritdoc
+ */
public function init()
{
- $this->addItem([
+
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.views_space_index', 'Spaces'),
'url' => Url::toRoute(['/admin/space/index']),
'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'space' && Yii::$app->controller->action->id == 'index'),
- 'isVisible' => Yii::$app->user->can(new ManageSpaces())
- ]);
- $this->addItem([
+ 'isActive' => MenuLink::isActiveState('admin', 'space', 'index'),
+ 'isVisible' => Yii::$app->user->can(ManageSpaces::class)
+ ]));
+
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.views_space_index', 'Settings'),
'url' => Url::toRoute(['/admin/space/settings']),
'sortOrder' => 200,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'space' && Yii::$app->controller->action->id == 'settings'),
- 'isVisible' => Yii::$app->user->can(new ManageSettings())
- ]);
+ 'isActive' => MenuLink::isActiveState('admin', 'space', 'settings'),
+ 'isVisible' => Yii::$app->user->can(ManageSettings::class)
+ ]));
parent::init();
}
diff --git a/protected/humhub/modules/admin/widgets/UserMenu.php b/protected/humhub/modules/admin/widgets/UserMenu.php
index 03b7fbfe1c..3f3171254d 100644
--- a/protected/humhub/modules/admin/widgets/UserMenu.php
+++ b/protected/humhub/modules/admin/widgets/UserMenu.php
@@ -9,81 +9,75 @@
namespace humhub\modules\admin\widgets;
use Yii;
-use yii\helpers\Url;
use humhub\modules\admin\models\UserApprovalSearch;
-use humhub\modules\admin\permissions\ManageUsers;
use humhub\modules\admin\permissions\ManageGroups;
use humhub\modules\admin\permissions\ManageSettings;
-use humhub\modules\user\models\Invite;
-use humhub\widgets\BaseMenu;
+use humhub\modules\admin\permissions\ManageUsers;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\ui\menu\widgets\TabMenu;
/**
* User Administration Menu
*
* @author Basti
*/
-class UserMenu extends BaseMenu
+class UserMenu extends TabMenu
{
- public $template = '@humhub/widgets/views/tabMenu';
- public $type = 'adminUserSubNavigation';
-
+ /**
+ * @inheritdoc
+ */
public function init()
{
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.views_user_index', 'Users'),
- 'url' => Url::to(['/admin/user/index']),
+ 'url' => ['/admin/user/index'],
'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && (Yii::$app->controller->id == 'user' || Yii::$app->controller->id == 'pending-registrations')),
+ 'isActive' => MenuLink::isActiveState('admin', ['user', 'pending-registrations']),
'isVisible' => Yii::$app->user->can([
- new ManageUsers(),
- new ManageGroups(),
+ ManageUsers::class,
+ ManageGroups::class,
])
- ]);
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.views_user_index', 'Settings'),
- 'url' => Url::to(['/admin/authentication']),
+ 'url' => ['/admin/authentication'],
'sortOrder' => 200,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'authentication'),
- 'isVisible' => Yii::$app->user->can([
- new ManageSettings()
- ])
- ]);
+ 'isActive' => MenuLink::isActiveState('admin', 'authentication'),
+ 'isVisible' => Yii::$app->user->can(ManageSettings::class)
+ ]));
$approvalCount = UserApprovalSearch::getUserApprovalCount();
+
if ($approvalCount > 0) {
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.user', 'Pending approvals') . ' ' . $approvalCount . '',
- 'url' => Url::to(['/admin/approval']),
+ 'url' => ['/admin/approval'],
'sortOrder' => 300,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'approval'),
+ 'isActive' => MenuLink::isActiveState('admin', 'approval'),
'isVisible' => Yii::$app->user->can([
- new ManageUsers(),
- new ManageGroups()
+ ManageUsers::class,
+ ManageGroups::class
])
- ]);
+ ]));
}
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.user', 'Profiles'),
- 'url' => Url::to(['/admin/user-profile']),
+ 'url' => ['/admin/user-profile'],
'sortOrder' => 400,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'user-profile'),
- 'isVisible' => Yii::$app->user->can([
- new ManageUsers()
- ])
- ]);
+ 'isActive' => MenuLink::isActiveState('admin', 'user-profile'),
+ 'isVisible' => Yii::$app->user->can(ManageUsers::class)
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.user', 'Groups'),
- 'url' => Url::to(['/admin/group']),
+ 'url' => ['/admin/group'],
'sortOrder' => 500,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'group'),
- 'isVisible' => Yii::$app->user->can(
- new ManageGroups()
- )
- ]);
+ 'isActive' => MenuLink::isActiveState('admin', 'group'),
+ 'isVisible' => Yii::$app->user->can(ManageGroups::class)
+ ]));
parent::init();
}
diff --git a/protected/humhub/modules/admin/widgets/UserSettingMenu.php b/protected/humhub/modules/admin/widgets/UserSettingMenu.php
index 52286274db..3b054c1369 100644
--- a/protected/humhub/modules/admin/widgets/UserSettingMenu.php
+++ b/protected/humhub/modules/admin/widgets/UserSettingMenu.php
@@ -9,33 +9,35 @@
namespace humhub\modules\admin\widgets;
use Yii;
-use yii\helpers\Url;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\ui\menu\widgets\TabMenu;
/**
* User Administration Menu
*
* @author Basti
*/
-class UserSettingMenu extends \humhub\widgets\BaseMenu
+class UserSettingMenu extends TabMenu
{
- public $template = "@humhub/widgets/views/tabMenu";
- public $type = "adminUserSettingNavigation";
-
+ /**
+ * @inheritdoc
+ */
public function init()
{
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.views_setting_authentication', 'General'),
- 'url' => Url::toRoute(['/admin/setting/authentication']),
+ 'url' => ['/admin/setting/authentication'],
'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'settings' && Yii::$app->controller->action->id == 'authentication'),
- ]);
- $this->addItem([
+ 'isActive' => MenuLink::isActiveState('admin', 'settings', 'authentication'),
+ ]));
+
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.views_setting_authentication', 'LDAP'),
- 'url' => Url::toRoute(['/admin/setting/authentication-ldap']),
+ 'url' => ['/admin/setting/authentication-ldap'],
'sortOrder' => 200,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'admin' && Yii::$app->controller->id == 'settings' && Yii::$app->controller->action->id == 'authentication-ldap'),
- ]);
+ 'isActive' => MenuLink::isActiveState('admin', 'settings', 'authentication-ldap'),
+ ]));
parent::init();
}
diff --git a/protected/humhub/modules/content/helpers/ContentContainerHelper.php b/protected/humhub/modules/content/helpers/ContentContainerHelper.php
index 35d47a9fc7..92c01ae79e 100644
--- a/protected/humhub/modules/content/helpers/ContentContainerHelper.php
+++ b/protected/humhub/modules/content/helpers/ContentContainerHelper.php
@@ -20,13 +20,14 @@ use humhub\modules\content\components\ContentContainerController;
class ContentContainerHelper
{
/**
+ * @param string|null $type type filter available since 1.4
* @return ContentContainerActiveRecord|null currently active container from app context.
*/
- public static function getCurrent()
+ public static function getCurrent($type = null)
{
$controller = Yii::$app->controller;
if($controller instanceof ContentContainerController) {
- return $controller->contentContainer;
+ return (!$type || get_class($controller->contentContainer) === $type) ? $controller->contentContainer : null;
}
return null;
diff --git a/protected/humhub/modules/content/widgets/WallEntry.php b/protected/humhub/modules/content/widgets/WallEntry.php
index 82f49e5aeb..64f336dedc 100644
--- a/protected/humhub/modules/content/widgets/WallEntry.php
+++ b/protected/humhub/modules/content/widgets/WallEntry.php
@@ -190,12 +190,12 @@ class WallEntry extends Widget
$this->addControl($result, [EditLink::class, ['model' => $this->contentObject, 'mode' => $this->editMode, 'url' => $this->getEditUrl()], ['sortOrder' => 200]]);
}
- $this->addControl($result, [VisibilityLink::class, ['contentRecord' => $this->contentObject], ['sortOrder' => 250]]);
- $this->addControl($result, [NotificationSwitchLink::class, ['content' => $this->contentObject], ['sortOrder' => 300]]);
- $this->addControl($result, [PermaLink::class, ['content' => $this->contentObject], ['sortOrder' => 400]]);
- $this->addControl($result, [PinLink::class, ['content' => $this->contentObject], ['sortOrder' => 500]]);
- $this->addControl($result, [MoveContentLink::class, ['model' => $this->contentObject], ['sortOrder' => 550]]);
- $this->addControl($result, [ArchiveLink::class, ['content' => $this->contentObject], ['sortOrder' => 600]]);
+ $this->addControl($result, [PermaLink::class, ['content' => $this->contentObject], ['sortOrder' => 300]]);
+ $this->addControl($result, [VisibilityLink::class, ['contentRecord' => $this->contentObject], ['sortOrder' => 400]]);
+ $this->addControl($result, [NotificationSwitchLink::class, ['content' => $this->contentObject], ['sortOrder' => 500]]);
+ $this->addControl($result, [PinLink::class, ['content' => $this->contentObject], ['sortOrder' => 600]]);
+ $this->addControl($result, [MoveContentLink::class, ['model' => $this->contentObject], ['sortOrder' => 700]]);
+ $this->addControl($result, [ArchiveLink::class, ['content' => $this->contentObject], ['sortOrder' => 800]]);
if(isset($this->controlsOptions['add'])) {
foreach ($this->controlsOptions['add'] as $linkOptions) {
diff --git a/protected/humhub/modules/content/widgets/WallEntryControls.php b/protected/humhub/modules/content/widgets/WallEntryControls.php
index c5c7edfc1e..bec0189342 100644
--- a/protected/humhub/modules/content/widgets/WallEntryControls.php
+++ b/protected/humhub/modules/content/widgets/WallEntryControls.php
@@ -48,8 +48,8 @@ class WallEntryControls extends \humhub\widgets\BaseStack
*
* [MyWidget::class, [...], [...]]
*
- * @param type $menuItem
- * @return type
+ * @param [] $menuItem
+ * @return array
*/
protected function getWallEntryLinkDefinition($menuItem)
{
diff --git a/protected/humhub/modules/dashboard/Events.php b/protected/humhub/modules/dashboard/Events.php
index e9392f961c..05d157ccad 100644
--- a/protected/humhub/modules/dashboard/Events.php
+++ b/protected/humhub/modules/dashboard/Events.php
@@ -8,9 +8,10 @@
namespace humhub\modules\dashboard;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\widgets\TopMenu;
use Yii;
-use yii\helpers\Url;
-use humhub\modules\dashboard\widgets\ShareWidget;
+use yii\base\Event;
/**
* Description of Events
@@ -21,23 +22,24 @@ class Events
{
/**
- * On build of the TopMenu, check if module is enabled
- * When enabled add a menu item
+ * TopMenu init event callback
*
- * @param type $event
+ * @see TopMenu
+ * @param Event $event
*/
public static function onTopMenuInit($event)
{
+ /** @var TopMenu $topMenu */
+ $topMenu = $event->sender;
- // Is Module enabled on this workspace?
- $event->sender->addItem([
- 'label' => Yii::t('DashboardModule.base', 'Dashboard'),
+ $topMenu->addEntry(new MenuLink([
'id' => 'dashboard',
- 'icon' => '',
- 'url' => Url::toRoute('/dashboard/dashboard'),
+ 'label' => Yii::t('DashboardModule.base', 'Dashboard'),
+ 'url' => ['/dashboard/dashboard'],
+ 'icon' => 'tachometer',
'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'dashboard'),
- ]);
+ 'isActive' => MenuLink::isActiveState('dashboard')
+ ]));
}
}
diff --git a/protected/humhub/modules/directory/widgets/Menu.php b/protected/humhub/modules/directory/widgets/Menu.php
index c03ba1d7ca..68c852b2b4 100644
--- a/protected/humhub/modules/directory/widgets/Menu.php
+++ b/protected/humhub/modules/directory/widgets/Menu.php
@@ -8,73 +8,62 @@
namespace humhub\modules\directory\widgets;
-use humhub\modules\directory\Module;
use Yii;
-use yii\helpers\Url;
-
-use humhub\modules\directory\models\User;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\directory\Module;
+use humhub\modules\ui\menu\widgets\LeftNavigation;
/**
- * Directory Menu
+ * Directory module navigation
*
* @since 0.21
* @author Luke
*/
-class Menu extends \humhub\widgets\BaseMenu
+class Menu extends LeftNavigation
{
-
- public $template = "@humhub/widgets/views/leftNavigation";
-
+ /**
+ * @inheritdoc
+ */
public function init()
{
/** @var Module $module */
$module = Yii::$app->getModule('directory');
- $this->addItemGroup([
- 'id' => 'directory',
- 'label' => Yii::t('DirectoryModule.base', 'Directory menu'),
- 'sortOrder' => 100,
- ]);
+ $this->panelTitle = Yii::t('DirectoryModule.base', 'Directory menu');
- if (Yii::$app->getModule('directory')->isGroupListingEnabled()) {
- $this->addItem([
+ if ($module->isGroupListingEnabled()) {
+ $this->addEntry(new MenuLink([
'label' => Yii::t('DirectoryModule.base', 'Groups'),
- 'group' => 'directory',
- 'url' => Url::to(['/directory/directory/groups']),
+ 'url' => ['/directory/directory/groups'],
'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->action->id == "groups"),
- ]);
+ 'isActive' => MenuLink::isActiveState('directory', 'directory', 'groups')
+ ]));
}
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('DirectoryModule.base', 'Members'),
- 'group' => 'directory',
- 'url' => Url::to(['/directory/directory/members']),
+ 'url' => ['/directory/directory/members'],
'sortOrder' => 200,
- 'isActive' => (Yii::$app->controller->action->id == "members"),
- ]);
+ 'isActive' => MenuLink::isActiveState('directory', 'directory', 'members')
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('DirectoryModule.base', 'Spaces'),
- 'group' => 'directory',
- 'url' => Url::to(['/directory/directory/spaces']),
+ 'url' => ['/directory/directory/spaces'],
'sortOrder' => 300,
- 'isActive' => (Yii::$app->controller->action->id == "spaces"),
- ]);
+ 'isActive' => MenuLink::isActiveState('directory', 'directory', 'spaces')
+ ]));
if ($module->showUserProfilePosts) {
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('DirectoryModule.base', 'User profile posts'),
- 'group' => 'directory',
- 'url' => Url::to(['/directory/directory/user-posts']),
+ 'url' => ['/directory/directory/user-posts'],
'sortOrder' => 400,
- 'isActive' => (Yii::$app->controller->action->id == "user-posts"),
- ]);
+ 'isActive' => MenuLink::isActiveState('directory', 'directory', 'user-posts')
+ ]));
}
parent::init();
}
}
-
-?>
diff --git a/protected/humhub/modules/friendship/widgets/ManageMenu.php b/protected/humhub/modules/friendship/widgets/ManageMenu.php
index 9506268899..edcd89d69b 100644
--- a/protected/humhub/modules/friendship/widgets/ManageMenu.php
+++ b/protected/humhub/modules/friendship/widgets/ManageMenu.php
@@ -9,13 +9,14 @@
namespace humhub\modules\friendship\widgets;
use Yii;
-use yii\helpers\Url;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\ui\menu\widgets\TabMenu;
use humhub\modules\friendship\models\Friendship;
/**
* Account Settings Tab Menu
*/
-class ManageMenu extends \humhub\widgets\BaseMenu
+class ManageMenu extends TabMenu
{
/**
@@ -23,39 +24,35 @@ class ManageMenu extends \humhub\widgets\BaseMenu
*/
public $user;
- /**
- * @inheritdoc
- */
- public $template = "@humhub/widgets/views/tabMenu";
-
/**
* @inheritdoc
*/
public function init()
{
$friendCount = Friendship::getFriendsQuery($this->user)->count();
- $this->addItem([
+
+ $this->addEntry(new MenuLink([
'label' => Yii::t('FriendshipModule.base', 'Friends') . ' (' . $friendCount . ')',
- 'url' => Url::toRoute(['/friendship/manage/list']),
+ 'url' => ['/friendship/manage/list'],
'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->id == 'manage' && Yii::$app->controller->action->id == 'list'),
- ]);
+ 'isActive' => MenuLink::isActiveState(null, 'manage', 'list')
+ ]));
$receivedRequestsCount = Friendship::getReceivedRequestsQuery($this->user)->count();
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('FriendshipModule.base', 'Requests') . ' (' . $receivedRequestsCount . ')',
- 'url' => Url::toRoute(['/friendship/manage/requests']),
+ 'url' => ['/friendship/manage/requests'],
'sortOrder' => 200,
- 'isActive' => (Yii::$app->controller->id == 'manage' && Yii::$app->controller->action->id == 'requests'),
- ]);
+ 'isActive' => MenuLink::isActiveState(null, 'manage', 'requests')
+ ]));
$sentRequestsCount = Friendship::getSentRequestsQuery($this->user)->count();
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('FriendshipModule.base', 'Sent requests') . ' (' . $sentRequestsCount . ')',
- 'url' => Url::toRoute(['/friendship/manage/sent-requests']),
+ 'url' => ['/friendship/manage/sent-requests'],
'sortOrder' => 300,
- 'isActive' => (Yii::$app->controller->id == 'manage' && Yii::$app->controller->action->id == 'sent-requests'),
- ]);
+ 'isActive' => MenuLink::isActiveState(null, 'manage', 'sent-requests')
+ ]));
parent::init();
}
diff --git a/protected/humhub/modules/space/modules/manage/widgets/DefaultMenu.php b/protected/humhub/modules/space/modules/manage/widgets/DefaultMenu.php
index 98a4d12cf8..a74a1798dc 100644
--- a/protected/humhub/modules/space/modules/manage/widgets/DefaultMenu.php
+++ b/protected/humhub/modules/space/modules/manage/widgets/DefaultMenu.php
@@ -8,39 +8,41 @@
namespace humhub\modules\space\modules\manage\widgets;
-use humhub\widgets\BaseMenu;
use Yii;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\ui\menu\widgets\TabMenu;
/**
* Space Administration Menu
*
* @author Luke
*/
-class DefaultMenu extends BaseMenu
+class DefaultMenu extends TabMenu
{
- public $template = '@humhub/widgets/views/tabMenu';
-
/**
* @var \humhub\modules\space\models\Space
*/
public $space;
+ /**
+ * @inheritdoc
+ */
public function init()
{
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.manage', 'Basic'),
'url' => $this->space->createUrl('/space/manage/default/index'),
'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->id == 'default' && Yii::$app->controller->action->id == 'index'),
- ]);
+ 'isActive' => MenuLink::isActiveState(null, 'default', 'index')
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.manage', 'Advanced'),
'url' => $this->space->createUrl('/space/manage/default/advanced'),
'sortOrder' => 200,
- 'isActive' => (Yii::$app->controller->id == 'default' && Yii::$app->controller->action->id == 'advanced'),
- ]);
+ 'isActive' => MenuLink::isActiveState(null, 'default', 'advanced')
+ ]));
parent::init();
}
diff --git a/protected/humhub/modules/space/modules/manage/widgets/MemberMenu.php b/protected/humhub/modules/space/modules/manage/widgets/MemberMenu.php
index e4ea5c81d0..f255e2d23a 100644
--- a/protected/humhub/modules/space/modules/manage/widgets/MemberMenu.php
+++ b/protected/humhub/modules/space/modules/manage/widgets/MemberMenu.php
@@ -8,24 +8,19 @@
namespace humhub\modules\space\modules\manage\widgets;
-use humhub\widgets\BaseMenu;
-use humhub\modules\space\modules\manage\models\MembershipSearch;
-use humhub\modules\space\models\Membership;
use Yii;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\space\models\Membership;
+use humhub\modules\space\modules\manage\models\MembershipSearch;
+use humhub\modules\ui\menu\widgets\TabMenu;
/**
* MemberMenu is a tabbed menu for space member administration
*
* @author Basti
*/
-class MemberMenu extends BaseMenu
+class MemberMenu extends TabMenu
{
-
- /**
- * @inheritdoc
- */
- public $template = '@humhub/widgets/views/tabMenu';
-
/**
* @var \humhub\modules\space\models\Space
*/
@@ -37,37 +32,37 @@ class MemberMenu extends BaseMenu
public function init()
{
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('SpaceModule.widgets_SpaceMembersMenu', 'Members'),
'url' => $this->space->createUrl('/space/manage/member/index'),
'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->action->id == 'index' && Yii::$app->controller->id === 'member'),
- ]);
+ 'isActive' => MenuLink::isActiveState(null, 'member', 'index')
+ ]));
if ($this->countPendingInvites() != 0) {
- $this->addItem([
- 'label' => Yii::t('SpaceModule.widgets_SpaceMembersMenu', 'Pending Invites') . ' '.$this->countPendingInvites().'',
+ $this->addEntry(new MenuLink([
+ 'label' => Yii::t('SpaceModule.widgets_SpaceMembersMenu', 'Pending Invites') . ' ' . $this->countPendingInvites() . '',
'url' => $this->space->createUrl('/space/manage/member/pending-invitations'),
'sortOrder' => 200,
- 'isActive' => (Yii::$app->controller->action->id == 'pending-invitations'),
- ]);
+ 'isActive' => MenuLink::isActiveState(null, 'member', 'pending-invitations')
+ ]));
}
if ($this->countPendingApprovals() != 0) {
- $this->addItem([
- 'label' => Yii::t('SpaceModule.widgets_SpaceMembersMenu', 'Pending Approvals'). ' '.$this->countPendingApprovals().'',
+ $this->addEntry(new MenuLink([
+ 'label' => Yii::t('SpaceModule.widgets_SpaceMembersMenu', 'Pending Approvals') . ' ' . $this->countPendingApprovals() . '',
'url' => $this->space->createUrl('/space/manage/member/pending-approvals'),
'sortOrder' => 300,
- 'isActive' => (Yii::$app->controller->action->id == 'pending-approvals'),
- ]);
+ 'isActive' => MenuLink::isActiveState(null, 'member', 'pending-approvals')
+ ]));
}
if ($this->space->isSpaceOwner()) {
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('SpaceModule.widgets_SpaceMembersMenu', 'Owner'),
'url' => $this->space->createUrl('/space/manage/member/change-owner'),
'sortOrder' => 500,
- 'isActive' => (Yii::$app->controller->action->id == 'change-owner'),
- ]);
+ 'isActive' => MenuLink::isActiveState(null, 'member', 'change-owner')
+ ]));
}
@@ -76,7 +71,7 @@ class MemberMenu extends BaseMenu
/**
* Returns the number of currently invited users
- *
+ *
* @return int currently invited members
*/
protected function countPendingInvites()
@@ -90,7 +85,7 @@ class MemberMenu extends BaseMenu
/**
* Returns the number of currently pending approvals
- *
+ *
* @return int currently pending approvals
*/
protected function countPendingApprovals()
diff --git a/protected/humhub/modules/space/modules/manage/widgets/SecurityTabMenu.php b/protected/humhub/modules/space/modules/manage/widgets/SecurityTabMenu.php
index 837a0a2551..1838f5be54 100644
--- a/protected/humhub/modules/space/modules/manage/widgets/SecurityTabMenu.php
+++ b/protected/humhub/modules/space/modules/manage/widgets/SecurityTabMenu.php
@@ -8,7 +8,8 @@
namespace humhub\modules\space\modules\manage\widgets;
-use humhub\widgets\BaseMenu;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\ui\menu\widgets\TabMenu;
use Yii;
/**
@@ -16,31 +17,32 @@ use Yii;
*
* @author Luke
*/
-class SecurityTabMenu extends BaseMenu
+class SecurityTabMenu extends TabMenu
{
- public $template = '@humhub/widgets/views/tabMenu';
-
/**
* @var \humhub\modules\space\models\Space
*/
public $space;
+ /**
+ * @inheritdoc
+ */
public function init()
{
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.manage', 'General'),
'url' => $this->space->createUrl('/space/manage/security'),
'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->id == 'security' && Yii::$app->controller->action->id == 'index'),
- ]);
+ 'isActive' => MenuLink::isActiveState(null, 'security', 'index'),
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('AdminModule.manage', 'Permissions'),
'url' => $this->space->createUrl('/space/manage/security/permissions'),
'sortOrder' => 200,
- 'isActive' => (Yii::$app->controller->id == 'security' && Yii::$app->controller->action->id == 'permissions'),
- ]);
+ 'isActive' => MenuLink::isActiveState(null, 'security', 'permissions'),
+ ]));
parent::init();
}
diff --git a/protected/humhub/modules/space/widgets/AdminMenu.php b/protected/humhub/modules/space/widgets/AdminMenu.php
deleted file mode 100755
index e1796159c4..0000000000
--- a/protected/humhub/modules/space/widgets/AdminMenu.php
+++ /dev/null
@@ -1,20 +0,0 @@
-
diff --git a/protected/humhub/modules/space/widgets/HeaderControlsMenu.php b/protected/humhub/modules/space/widgets/HeaderControlsMenu.php
index c0d2215942..e353040f56 100644
--- a/protected/humhub/modules/space/widgets/HeaderControlsMenu.php
+++ b/protected/humhub/modules/space/widgets/HeaderControlsMenu.php
@@ -8,7 +8,10 @@
namespace humhub\modules\space\widgets;
-use humhub\widgets\BaseMenu;
+use humhub\modules\space\models\Space;
+use humhub\modules\ui\menu\DropdownDivider;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\ui\menu\widgets\DropdownMenu;
use Yii;
/**
@@ -18,108 +21,99 @@ use Yii;
* @package humhub.modules_core.space.widgets
* @since 0.5
*/
-class HeaderControlsMenu extends BaseMenu
+class HeaderControlsMenu extends DropdownMenu
{
-
+ /**
+ * @var Space
+ */
public $space;
- public $template = '@humhub/widgets/views/leftNavigation';
+ /**
+ * @inheritdoc
+ */
+ public $label = '';
+
+ /**
+ * @inheritdoc
+ */
public function init()
{
- $this->addItemGroup([
- 'id' => 'admin',
- 'label' => Yii::t('SpaceModule.widgets_SpaceAdminMenuWidget', ''),
- 'sortOrder' => 100,
- ]);
+ if ($this->template === '@humhub/widgets/views/dropdownNavigation') {
+ $this->template = '@ui/menu/widgets/views/dropdown-menu.php';
+ }
+
// check user rights
if ($this->space->isAdmin()) {
-
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('SpaceModule.base', 'Settings'),
- 'group' => 'admin',
'url' => $this->space->createUrl('/space/manage'),
- 'icon' => '',
- 'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->id === 'default'),
- ]);
+ 'icon' => 'cogs',
+ 'sortOrder' => 100
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('SpaceModule.widgets_SpaceAdminMenuWidget', 'Security'),
- 'group' => 'admin',
'url' => $this->space->createUrl('/space/manage/security'),
- 'icon' => '',
+ 'icon' => 'lock',
'sortOrder' => 200,
- 'isActive' => (Yii::$app->controller->id === 'security'),
- ]);
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('SpaceModule.widgets_SpaceAdminMenuWidget', 'Members'),
- 'group' => 'admin',
'url' => $this->space->createUrl('/space/manage/member'),
- 'icon' => '',
- 'sortOrder' => 200,
- 'isActive' => (Yii::$app->controller->id === 'member'),
- ]);
+ 'icon' => 'group',
+ 'sortOrder' => 300
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('SpaceModule.widgets_SpaceAdminMenuWidget', 'Modules'),
- 'group' => 'admin',
'url' => $this->space->createUrl('/space/manage/module'),
- 'icon' => '',
- 'sortOrder' => 300,
- 'isActive' => (Yii::$app->controller->id === 'module'),
- ]);
+ 'icon' => 'rocket',
+ 'sortOrder' => 400,
+ ]));
+
+ $this->addEntry(new DropdownDivider(['sortOrder' => 500]));
}
if ($this->space->isMember()) {
-
$membership = $this->space->getMembership();
if (!$membership->send_notifications) {
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('SpaceModule.widgets_SpaceAdminMenuWidget', 'Receive Notifications for new content'),
- 'group' => 'admin',
'url' => $this->space->createUrl('/space/membership/receive-notifications'),
- 'icon' => '',
- 'sortOrder' => 300,
- 'isActive' => (Yii::$app->controller->id === 'module'),
+ 'icon' => 'bell',
+ 'sortOrder' => 600,
'htmlOptions' => ['data-method' => 'POST']
- ]);
+ ]));
} else {
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('SpaceModule.widgets_SpaceAdminMenuWidget', 'Don\'t receive notifications for new content'),
- 'group' => 'admin',
'url' => $this->space->createUrl('/space/membership/revoke-notifications'),
- 'icon' => '',
- 'sortOrder' => 300,
- 'isActive' => (Yii::$app->controller->id === 'module'),
+ 'icon' => 'bell-o',
+ 'sortOrder' => 600,
'htmlOptions' => ['data-method' => 'POST']
- ]);
+ ]));
}
if (!$this->space->isSpaceOwner() && $this->space->canLeave()) {
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('SpaceModule.widgets_SpaceAdminMenuWidget', 'Cancel Membership'),
- 'group' => 'admin',
'url' => $this->space->createUrl('/space/membership/revoke-membership'),
- 'icon' => '',
- 'sortOrder' => 300,
- 'isActive' => (Yii::$app->controller->id === 'module'),
+ 'icon' => 'times',
+ 'sortOrder' => 700,
'htmlOptions' => ['data-method' => 'POST']
- ]);
+ ]));
}
if ($membership->show_at_dashboard) {
-
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('SpaceModule.widgets_SpaceAdminMenuWidget', 'Hide posts on dashboard'),
- 'group' => 'admin',
'url' => $this->space->createUrl('/space/membership/switch-dashboard-display', ['show' => 0]),
- 'icon' => '',
- 'sortOrder' => 400,
- 'isActive' => (Yii::$app->controller->id === 'module'),
+ 'icon' => 'eye-slash',
+ 'sortOrder' => 800,
'htmlOptions' => [
'data-method' => 'POST',
'class' => 'tt',
@@ -127,22 +121,20 @@ class HeaderControlsMenu extends BaseMenu
'data-placement' => 'left',
'title' => Yii::t('SpaceModule.widgets_SpaceAdminMenuWidget', 'This option will hide new content from this space at your dashboard')
]
- ]);
+ ]));
} else {
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('SpaceModule.widgets_SpaceAdminMenuWidget', 'Show posts on dashboard'),
- 'group' => 'admin',
'url' => $this->space->createUrl('/space/membership/switch-dashboard-display', ['show' => 1]),
- 'icon' => '',
- 'sortOrder' => 400,
- 'isActive' => (Yii::$app->controller->id === 'module'),
+ 'icon' => 'fa-eye',
+ 'sortOrder' => 800,
'htmlOptions' => ['data-method' => 'POST',
'class' => 'tt',
'data-toggle' => 'tooltip',
'data-placement' => 'left',
'title' => Yii::t('SpaceModule.widgets_SpaceAdminMenuWidget', 'This option will show new content from this space at your dashboard')
]
- ]);
+ ]));
}
}
diff --git a/protected/humhub/modules/space/widgets/Menu.php b/protected/humhub/modules/space/widgets/Menu.php
index 778e0f9263..fee670a050 100755
--- a/protected/humhub/modules/space/widgets/Menu.php
+++ b/protected/humhub/modules/space/widgets/Menu.php
@@ -8,9 +8,11 @@
namespace humhub\modules\space\widgets;
-use humhub\widgets\BaseMenu;
use humhub\modules\content\components\ContentContainerController;
+use humhub\modules\content\helpers\ContentContainerHelper;
use humhub\modules\space\models\Space;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\ui\menu\widgets\LeftNavigation;
use Yii;
use yii\base\Exception;
@@ -18,41 +20,38 @@ use yii\base\Exception;
* The Main Navigation for a space. It includes the Modules the Stream
*
* @author Luke
- * @package humhub.modules_core.space.widgets
* @since 0.5
*/
-class Menu extends BaseMenu
+class Menu extends LeftNavigation
{
+
/** @var Space */
public $space;
- public $template = '@humhub/widgets/views/leftNavigation';
+ /**
+ * @inheritdoc
+ */
public function init()
{
- if ($this->space === null && Yii::$app->controller instanceof ContentContainerController && Yii::$app->controller->contentContainer instanceof Space) {
- $this->space = Yii::$app->controller->contentContainer;
+ if(!$this->space) {
+ $this->space = ContentContainerHelper::getCurrent(Space::class);
}
- if ($this->space === null) {
+ if (!$this->space) {
throw new Exception('Could not instance space menu without space!');
}
-
+
$this->id = 'navigation-menu-space-' . $this->space->getUniqueId();
- $this->addItemGroup([
- 'id' => 'modules',
- 'label' => Yii::t('SpaceModule.widgets_SpaceMenuWidget', 'Space menu'),
- 'sortOrder' => 100,
- ]);
+ $this->panelTitle = Yii::t('SpaceModule.widgets_SpaceMenuWidget', 'Space menu');
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('SpaceModule.widgets_SpaceMenuWidget', 'Stream'),
- 'group' => 'modules',
'url' => $this->space->createUrl('/space/space/home'),
- 'icon' => '',
+ 'icon' => 'fa-bars',
'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->id == 'space' && (Yii::$app->controller->action->id == 'index' || Yii::$app->controller->action->id == 'home') && Yii::$app->controller->module->id == 'space'),
- ]);
+ 'isActive' => MenuLink::isActiveState('space', 'space', ['index', 'home']),
+ ]));
parent::init();
}
@@ -61,17 +60,17 @@ class Menu extends BaseMenu
* Searches for urls of modules which are activated for the current space
* and offer an own site over the space menu.
* The urls are associated with a module label.
- *
- * Returns an array of urls with associated module labes for modules
- * @param type $space
+ *
+ * Returns an array of urls with associated module labes for modules
*/
public static function getAvailablePages()
{
//Initialize the space Menu to check which active modules have an own page
- $moduleItems = (new static())->getItems('modules');
+ $entries = (new static())->getEntries(MenuLink::class);
$result = [];
- foreach ($moduleItems as $moduleItem) {
- $result[$moduleItem['url']] = $moduleItem['label'];
+ foreach ($entries as $entry) {
+ /* @var $entry MenuLink */
+ $result[$entry->getUrl()] = $entry->getLabel();
}
return $result;
@@ -79,7 +78,8 @@ class Menu extends BaseMenu
/**
* Returns space default / homepage
- *
+ *
+ * @param Space $space
* @return string|null the url to redirect or null for default home
*/
public static function getDefaultPageUrl($space)
@@ -91,10 +91,10 @@ class Menu extends BaseMenu
$pages = static::getAvailablePages();
if (isset($pages[$indexUrl])) {
return $indexUrl;
- } else {
- //Either the module was deactivated or url changed
- $settings->contentContainer($space)->delete('indexUrl');
}
+
+ //Either the module was deactivated or url changed
+ $settings->contentContainer($space)->delete('indexUrl');
}
return null;
@@ -102,7 +102,8 @@ class Menu extends BaseMenu
/**
* Returns space default / homepage
- *
+ *
+ * @param $space Space
* @return string|null the url to redirect or null for default home
*/
public static function getGuestsDefaultPageUrl($space)
@@ -114,10 +115,10 @@ class Menu extends BaseMenu
$pages = static::getAvailablePages();
if (isset($pages[$indexUrl])) {
return $indexUrl;
- } else {
- //Either the module was deactivated or url changed
- $settings->contentContainer($space)->delete('indexGuestUrl');
}
+
+ //Either the module was deactivated or url changed
+ $settings->contentContainer($space)->delete('indexGuestUrl');
}
return null;
diff --git a/protected/humhub/modules/space/widgets/views/header.php b/protected/humhub/modules/space/widgets/views/header.php
index 4138a4ae26..da23003808 100755
--- a/protected/humhub/modules/space/widgets/views/header.php
+++ b/protected/humhub/modules/space/widgets/views/header.php
@@ -181,10 +181,7 @@ if ($space->isAdmin()) {
['sortOrder' => 30]]
]]);
?>
- = HeaderControlsMenu::widget([
- 'space' => $space,
- 'template' => '@humhub/widgets/views/dropdownNavigation'
- ]);
+ = HeaderControlsMenu::widget(['space' => $space]);
?>
diff --git a/protected/humhub/modules/ui/form/validators/IconValidator.php b/protected/humhub/modules/ui/form/validators/IconValidator.php
index 6577a60fe0..586eae1d90 100644
--- a/protected/humhub/modules/ui/form/validators/IconValidator.php
+++ b/protected/humhub/modules/ui/form/validators/IconValidator.php
@@ -9,6 +9,7 @@
namespace humhub\modules\ui\form\validators;
use humhub\modules\ui\form\widgets\IconPicker;
+use humhub\modules\ui\icon\widgets\Icon;
use Yii;
use yii\validators\Validator;
@@ -30,7 +31,7 @@ class IconValidator extends Validator
{
$iconPicker = new IconPicker(['model' => $model, 'attribute' => $attribute]);
- if (!in_array($model->$attribute, $iconPicker->getIcons())) {
+ if (!in_array($model->$attribute, Icon::$names)) {
$this->addError($model, $attribute, Yii::t('UiModule.form', 'Invalid icon.'));
}
}
diff --git a/protected/humhub/modules/ui/form/widgets/IconPicker.php b/protected/humhub/modules/ui/form/widgets/IconPicker.php
index 70c65eeeff..6d89d73223 100644
--- a/protected/humhub/modules/ui/form/widgets/IconPicker.php
+++ b/protected/humhub/modules/ui/form/widgets/IconPicker.php
@@ -9,6 +9,7 @@
namespace humhub\modules\ui\form\widgets;
+use humhub\modules\ui\icon\widgets\Icon;
use kartik\select2\Select2;
use Yii;
use yii\web\JsExpression;
@@ -28,591 +29,9 @@ use yii\web\JsExpression;
class IconPicker extends Select2
{
/**
- * @var array the list of available icons
+ * @var string optional icon provider id
*/
- public $icons = [
- 'fa-adjust',
- 'fa-adn',
- 'fa-align-center',
- 'fa-align-justify',
- 'fa-align-left',
- 'fa-align-right',
- 'fa-ambulance',
- 'fa-anchor',
- 'fa-android',
- 'fa-angellist',
- 'fa-angle-double-down',
- 'fa-angle-double-left',
- 'fa-angle-double-right',
- 'fa-angle-double-up',
- 'fa-angle-down',
- 'fa-angle-left',
- 'fa-angle-right',
- 'fa-angle-up',
- 'fa-apple',
- 'fa-archive',
- 'fa-area-chart',
- 'fa-arrow-circle-down',
- 'fa-arrow-circle-left',
- 'fa-arrow-circle-o-down',
- 'fa-arrow-circle-o-left',
- 'fa-arrow-circle-o-right',
- 'fa-arrow-circle-o-up',
- 'fa-arrow-circle-right',
- 'fa-arrow-circle-up',
- 'fa-arrow-down',
- 'fa-arrow-left',
- 'fa-arrow-right',
- 'fa-arrow-up',
- 'fa-arrows',
- 'fa-arrows-alt',
- 'fa-arrows-h',
- 'fa-arrows-v',
- 'fa-asterisk',
- 'fa-at',
- 'fa-backward',
- 'fa-ban',
- 'fa-bank-alias',
- 'fa-bar-chart',
- 'fa-bar-chart-o-alias',
- 'fa-barcode',
- 'fa-bars',
- 'fa-bed',
- 'fa-beer',
- 'fa-behance',
- 'fa-behance-square',
- 'fa-bell',
- 'fa-bell-o',
- 'fa-bell-slash',
- 'fa-bell-slash-o',
- 'fa-bicycle',
- 'fa-binoculars',
- 'fa-birthday-cake',
- 'fa-bitbucket',
- 'fa-bitbucket-square',
- 'fa-bitcoin-alias',
- 'fa-bold',
- 'fa-bolt',
- 'fa-bomb',
- 'fa-book',
- 'fa-bookmark',
- 'fa-bookmark-o',
- 'fa-briefcase',
- 'fa-btc',
- 'fa-bug',
- 'fa-building',
- 'fa-building-o',
- 'fa-bullhorn',
- 'fa-bullseye',
- 'fa-bus',
- 'fa-buysellads',
- 'fa-cab-alias',
- 'fa-calculator',
- 'fa-calendar',
- 'fa-calendar-o',
- 'fa-camera',
- 'fa-camera-retro',
- 'fa-car',
- 'fa-caret-down',
- 'fa-caret-left',
- 'fa-caret-right',
- 'fa-caret-square-o-down',
- 'fa-caret-square-o-left',
- 'fa-caret-square-o-right',
- 'fa-caret-square-o-up',
- 'fa-caret-up',
- 'fa-cart-arrow-down',
- 'fa-cart-plus',
- 'fa-cc',
- 'fa-cc-amex',
- 'fa-cc-discover',
- 'fa-cc-mastercard',
- 'fa-cc-paypal',
- 'fa-cc-stripe',
- 'fa-cc-visa',
- 'fa-certificate',
- 'fa-chain-alias',
- 'fa-chain-broken',
- 'fa-check',
- 'fa-check-circle',
- 'fa-check-circle-o',
- 'fa-check-square',
- 'fa-check-square-o',
- 'fa-chevron-circle-down',
- 'fa-chevron-circle-left',
- 'fa-chevron-circle-right',
- 'fa-chevron-circle-up',
- 'fa-chevron-down',
- 'fa-chevron-left',
- 'fa-chevron-right',
- 'fa-chevron-up',
- 'fa-child',
- 'fa-circle',
- 'fa-circle-o',
- 'fa-circle-o-notch',
- 'fa-circle-thin',
- 'fa-clipboard',
- 'fa-clock-o',
- 'fa-close-alias',
- 'fa-cloud',
- 'fa-cloud-download',
- 'fa-cloud-upload',
- 'fa-cny-alias',
- 'fa-code',
- 'fa-code-fork',
- 'fa-codepen',
- 'fa-coffee',
- 'fa-cog',
- 'fa-cogs',
- 'fa-columns',
- 'fa-comment',
- 'fa-comment-o',
- 'fa-comments',
- 'fa-comments-o',
- 'fa-compass',
- 'fa-compress',
- 'fa-connectdevelop',
- 'fa-copy-alias',
- 'fa-copyright',
- 'fa-credit-card',
- 'fa-crop',
- 'fa-crosshairs',
- 'fa-css3',
- 'fa-cube',
- 'fa-cubes',
- 'fa-cut-alias',
- 'fa-cutlery',
- 'fa-dashboard-alias',
- 'fa-dashcube',
- 'fa-database',
- 'fa-dedent-alias',
- 'fa-delicious',
- 'fa-desktop',
- 'fa-deviantart',
- 'fa-diamond',
- 'fa-digg',
- 'fa-dollar-alias',
- 'fa-dot-circle-o',
- 'fa-download',
- 'fa-dribbble',
- 'fa-dropbox',
- 'fa-drupal',
- 'fa-edit-alias',
- 'fa-eject',
- 'fa-ellipsis-h',
- 'fa-ellipsis-v',
- 'fa-empire',
- 'fa-envelope',
- 'fa-envelope-o',
- 'fa-envelope-square',
- 'fa-eraser',
- 'fa-eur',
- 'fa-euro-alias',
- 'fa-exchange',
- 'fa-exclamation',
- 'fa-exclamation-circle',
- 'fa-exclamation-triangle',
- 'fa-expand',
- 'fa-external-link',
- 'fa-external-link-square',
- 'fa-eye',
- 'fa-eye-slash',
- 'fa-eyedropper',
- 'fa-facebook',
- 'fa-facebook-f-alias',
- 'fa-facebook-official',
- 'fa-facebook-square',
- 'fa-fast-backward',
- 'fa-fast-forward',
- 'fa-fax',
- 'fa-female',
- 'fa-fighter-jet',
- 'fa-file',
- 'fa-file-archive-o',
- 'fa-file-audio-o',
- 'fa-file-code-o',
- 'fa-file-excel-o',
- 'fa-file-image-o',
- 'fa-file-movie-o-alias',
- 'fa-file-o',
- 'fa-file-pdf-o',
- 'fa-file-photo-o-alias',
- 'fa-file-picture-o-alias',
- 'fa-file-powerpoint-o',
- 'fa-file-sound-o-alias',
- 'fa-file-text',
- 'fa-file-text-o',
- 'fa-file-video-o',
- 'fa-file-word-o',
- 'fa-file-zip-o-alias',
- 'fa-files-o',
- 'fa-film',
- 'fa-filter',
- 'fa-fire',
- 'fa-fire-extinguisher',
- 'fa-flag',
- 'fa-flag-checkered',
- 'fa-flag-o',
- 'fa-flash-alias',
- 'fa-flask',
- 'fa-flickr',
- 'fa-floppy-o',
- 'fa-folder',
- 'fa-folder-o',
- 'fa-folder-open',
- 'fa-folder-open-o',
- 'fa-font',
- 'fa-forumbee',
- 'fa-forward',
- 'fa-foursquare',
- 'fa-frown-o',
- 'fa-futbol-o',
- 'fa-gamepad',
- 'fa-gavel',
- 'fa-gbp',
- 'fa-ge-alias',
- 'fa-gear-alias',
- 'fa-gears-alias',
- 'fa-genderless-alias',
- 'fa-gift',
- 'fa-git',
- 'fa-git-square',
- 'fa-github',
- 'fa-github-alt',
- 'fa-github-square',
- 'fa-gittip-alias',
- 'fa-glass',
- 'fa-globe',
- 'fa-google',
- 'fa-google-plus',
- 'fa-google-plus-square',
- 'fa-google-wallet',
- 'fa-graduation-cap',
- 'fa-gratipay',
- 'fa-group-alias',
- 'fa-h-square',
- 'fa-hacker-news',
- 'fa-hand-o-down',
- 'fa-hand-o-left',
- 'fa-hand-o-right',
- 'fa-hand-o-up',
- 'fa-hdd-o',
- 'fa-header',
- 'fa-headphones',
- 'fa-heart',
- 'fa-heart-o',
- 'fa-heartbeat',
- 'fa-history',
- 'fa-home',
- 'fa-hospital-o',
- 'fa-hotel-alias',
- 'fa-html5',
- 'fa-ils',
- 'fa-image-alias',
- 'fa-inbox',
- 'fa-indent',
- 'fa-info',
- 'fa-info-circle',
- 'fa-inr',
- 'fa-instagram',
- 'fa-institution-alias',
- 'fa-ioxhost',
- 'fa-italic',
- 'fa-joomla',
- 'fa-jpy',
- 'fa-jsfiddle',
- 'fa-key',
- 'fa-keyboard-o',
- 'fa-krw',
- 'fa-language',
- 'fa-laptop',
- 'fa-lastfm',
- 'fa-lastfm-square',
- 'fa-leaf',
- 'fa-leanpub',
- 'fa-legal-alias',
- 'fa-lemon-o',
- 'fa-level-down',
- 'fa-level-up',
- 'fa-life-bouy-alias',
- 'fa-life-buoy-alias',
- 'fa-life-ring',
- 'fa-life-saver-alias',
- 'fa-lightbulb-o',
- 'fa-line-chart',
- 'fa-link',
- 'fa-linkedin',
- 'fa-linkedin-square',
- 'fa-linux',
- 'fa-list',
- 'fa-list-alt',
- 'fa-list-ol',
- 'fa-list-ul',
- 'fa-location-arrow',
- 'fa-lock',
- 'fa-long-arrow-down',
- 'fa-long-arrow-left',
- 'fa-long-arrow-right',
- 'fa-long-arrow-up',
- 'fa-magic',
- 'fa-magnet',
- 'fa-mail-forward-alias',
- 'fa-mail-reply-alias',
- 'fa-mail-reply-all-alias',
- 'fa-male',
- 'fa-map-marker',
- 'fa-mars',
- 'fa-mars-double',
- 'fa-mars-stroke',
- 'fa-mars-stroke-h',
- 'fa-mars-stroke-v',
- 'fa-maxcdn',
- 'fa-meanpath',
- 'fa-medium',
- 'fa-medkit',
- 'fa-meh-o',
- 'fa-mercury',
- 'fa-microphone',
- 'fa-microphone-slash',
- 'fa-minus',
- 'fa-minus-circle',
- 'fa-minus-square',
- 'fa-minus-square-o',
- 'fa-mobile',
- 'fa-mobile-phone-alias',
- 'fa-money',
- 'fa-moon-o',
- 'fa-mortar-board-alias',
- 'fa-motorcycle',
- 'fa-music',
- 'fa-navicon-alias',
- 'fa-neuter',
- 'fa-newspaper-o',
- 'fa-openid',
- 'fa-outdent',
- 'fa-pagelines',
- 'fa-paint-brush',
- 'fa-paper-plane',
- 'fa-paper-plane-o',
- 'fa-paperclip',
- 'fa-paragraph',
- 'fa-paste-alias',
- 'fa-pause',
- 'fa-paw',
- 'fa-paypal',
- 'fa-pencil',
- 'fa-pencil-square',
- 'fa-pencil-square-o',
- 'fa-phone',
- 'fa-phone-square',
- 'fa-photo-alias',
- 'fa-picture-o',
- 'fa-pie-chart',
- 'fa-pied-piper',
- 'fa-pied-piper-alt',
- 'fa-pinterest',
- 'fa-pinterest-p',
- 'fa-pinterest-square',
- 'fa-plane',
- 'fa-play',
- 'fa-play-circle',
- 'fa-play-circle-o',
- 'fa-plug',
- 'fa-plus',
- 'fa-plus-circle',
- 'fa-plus-square',
- 'fa-plus-square-o',
- 'fa-power-off',
- 'fa-print',
- 'fa-puzzle-piece',
- 'fa-qq',
- 'fa-qrcode',
- 'fa-question',
- 'fa-question-circle',
- 'fa-quote-left',
- 'fa-quote-right',
- 'fa-ra-alias',
- 'fa-random',
- 'fa-rebel',
- 'fa-recycle',
- 'fa-reddit',
- 'fa-reddit-square',
- 'fa-refresh',
- 'fa-remove-alias',
- 'fa-renren',
- 'fa-reorder-alias',
- 'fa-repeat',
- 'fa-reply',
- 'fa-reply-all',
- 'fa-retweet',
- 'fa-rmb-alias',
- 'fa-road',
- 'fa-rocket',
- 'fa-rotate-left-alias',
- 'fa-rotate-right-alias',
- 'fa-rouble-alias',
- 'fa-rss',
- 'fa-rss-square',
- 'fa-rub',
- 'fa-ruble-alias',
- 'fa-rupee-alias',
- 'fa-save-alias',
- 'fa-scissors',
- 'fa-search',
- 'fa-search-minus',
- 'fa-search-plus',
- 'fa-sellsy',
- 'fa-send-alias',
- 'fa-send-o-alias',
- 'fa-server',
- 'fa-share',
- 'fa-share-alt',
- 'fa-share-alt-square',
- 'fa-share-square',
- 'fa-share-square-o',
- 'fa-shekel-alias',
- 'fa-sheqel-alias',
- 'fa-shield',
- 'fa-ship',
- 'fa-shirtsinbulk',
- 'fa-shopping-cart',
- 'fa-sign-in',
- 'fa-sign-out',
- 'fa-signal',
- 'fa-simplybuilt',
- 'fa-sitemap',
- 'fa-skyatlas',
- 'fa-skype',
- 'fa-slack',
- 'fa-sliders',
- 'fa-slideshare',
- 'fa-smile-o',
- 'fa-soccer-ball-o-alias',
- 'fa-sort',
- 'fa-sort-alpha-asc',
- 'fa-sort-alpha-desc',
- 'fa-sort-amount-asc',
- 'fa-sort-amount-desc',
- 'fa-sort-asc',
- 'fa-sort-desc',
- 'fa-sort-down-alias',
- 'fa-sort-numeric-asc',
- 'fa-sort-numeric-desc',
- 'fa-sort-up-alias',
- 'fa-soundcloud',
- 'fa-space-shuttle',
- 'fa-spinner',
- 'fa-spoon',
- 'fa-spotify',
- 'fa-square',
- 'fa-square-o',
- 'fa-stack-exchange',
- 'fa-stack-overflow',
- 'fa-star',
- 'fa-star-half',
- 'fa-star-half-empty-alias',
- 'fa-star-half-full-alias',
- 'fa-star-half-o',
- 'fa-star-o',
- 'fa-steam',
- 'fa-steam-square',
- 'fa-step-backward',
- 'fa-step-forward',
- 'fa-stethoscope',
- 'fa-stop',
- 'fa-street-view',
- 'fa-strikethrough',
- 'fa-stumbleupon',
- 'fa-stumbleupon-circle',
- 'fa-subscript',
- 'fa-subway',
- 'fa-suitcase',
- 'fa-sun-o',
- 'fa-superscript',
- 'fa-support-alias',
- 'fa-table',
- 'fa-tablet',
- 'fa-tachometer',
- 'fa-tag',
- 'fa-tags',
- 'fa-tasks',
- 'fa-taxi',
- 'fa-tencent-weibo',
- 'fa-terminal',
- 'fa-text-height',
- 'fa-text-width',
- 'fa-th',
- 'fa-th-large',
- 'fa-th-list',
- 'fa-thumb-tack',
- 'fa-thumbs-down',
- 'fa-thumbs-o-down',
- 'fa-thumbs-o-up',
- 'fa-thumbs-up',
- 'fa-ticket',
- 'fa-times',
- 'fa-times-circle',
- 'fa-times-circle-o',
- 'fa-tint',
- 'fa-toggle-off',
- 'fa-toggle-on',
- 'fa-train',
- 'fa-transgender',
- 'fa-transgender-alt',
- 'fa-trash',
- 'fa-trash-o',
- 'fa-tree',
- 'fa-trello',
- 'fa-trophy',
- 'fa-truck',
- 'fa-try',
- 'fa-tty',
- 'fa-tumblr',
- 'fa-tumblr-square',
- 'fa-twitch',
- 'fa-twitter',
- 'fa-twitter-square',
- 'fa-umbrella',
- 'fa-underline',
- 'fa-undo',
- 'fa-university',
- 'fa-unlock',
- 'fa-unlock-alt',
- 'fa-upload',
- 'fa-usd',
- 'fa-user',
- 'fa-user-md',
- 'fa-user-plus',
- 'fa-user-secret',
- 'fa-user-times',
- 'fa-users',
- 'fa-venus',
- 'fa-venus-double',
- 'fa-venus-mars',
- 'fa-viacoin',
- 'fa-video-camera',
- 'fa-vimeo-square',
- 'fa-vine',
- 'fa-vk',
- 'fa-volume-down',
- 'fa-volume-off',
- 'fa-volume-up',
- 'fa-weibo',
- 'fa-weixin',
- 'fa-whatsapp',
- 'fa-wheelchair',
- 'fa-wifi',
- 'fa-windows',
- 'fa-wordpress',
- 'fa-wrench',
- 'fa-xing',
- 'fa-xing-square',
- 'fa-yahoo',
- 'fa-yelp',
- 'fa-youtube',
- 'fa-youtube-play',
- 'fa-youtube-square'
- ];
+ public $lib;
/**
* @inheritdoc
@@ -627,6 +46,18 @@ class IconPicker extends Select2
parent::init();
}
+ /**
+ * @inheritdoc
+ */
+ public function run()
+ {
+ $this->value = (strpos($this->value, 'fa-') === 0)
+ ? substr($this->value, 3, strlen($this->value))
+ : $this->value;
+
+ return parent::run();
+ }
+
/**
* @inheritdoc
*/
@@ -641,13 +72,13 @@ class IconPicker extends Select2
*/
protected function populateIconList()
{
- foreach ($this->getIcons() as $icon) {
+ foreach ($this->getIconNames() as $icon) {
$title = $icon;
if (substr($title, 0, 3) === 'fa-') {
$title = substr($title, 3);
}
- $this->data[$icon] = ' ' . $title;
+ $this->data[$icon] = Icon::get(['name' => $icon, 'lib' => $this->lib]) . ' ' . $title;
}
}
@@ -656,9 +87,9 @@ class IconPicker extends Select2
*
* @return array a list of icons
*/
- public function getIcons()
+ public function getIconNames()
{
- return $this->icons;
+ return Icon::getNames($this->lib);
}
}
diff --git a/protected/humhub/modules/ui/icon/components/FontAwesomeIconProvider.php b/protected/humhub/modules/ui/icon/components/FontAwesomeIconProvider.php
new file mode 100644
index 0000000000..3c36b8861f
--- /dev/null
+++ b/protected/humhub/modules/ui/icon/components/FontAwesomeIconProvider.php
@@ -0,0 +1,126 @@
+htmlOptions;
+ $options['class'] = 'fa fa-'.$icon->name;
+
+ if($icon->size) {
+ Html::addCssClass($options, $this->getIconSizeClass($icon));
+ }
+
+ if($icon->fixedWidth) {
+ Html::addCssClass($options, 'fa-fw');
+ }
+
+ if($icon->listItem) {
+ Html::addCssClass($options, 'fa-li');
+ }
+
+ if($icon->right) {
+ Html::addCssClass($options, 'fa-pull-right');
+ }
+
+ if($icon->left) {
+ Html::addCssClass($options, 'fa-pull-left');
+ }
+
+ if($icon->border) {
+ Html::addCssClass($options, 'fa-border');
+ }
+
+ if($icon->ariaHidden) {
+ $options['aria-hidden'] = 'true';
+ }
+
+ if($icon->color) {
+ Html::addCssStyle($options, ['color' => $icon->color]);
+ }
+
+ return Html::beginTag('i', $options).Html::endTag('i');
+ }
+
+ /**
+ * @param $listDefinition []
+ * @return $
+ */
+ public function renderList($listDefinition)
+ {
+ $items = [];
+ foreach ($listDefinition as $listItem)
+ {
+ $text = reset($listItem);
+ $iconName = key($listItem);
+ $options = (isset($listItem['options'])) ? $listItem['options'] : [];
+ $options['listItem'] = true;
+ $items[] = $this->render($iconName, $options).$text;
+ }
+
+ return Html::ul($items, ['class' => 'fa-ul', 'encode' => false]);
+ }
+
+ private function getIconSizeClass(Icon $icon)
+ {
+ switch ($icon->size) {
+ case Icon::SIZE_SM:
+ return 'fa-sm';
+ case Icon::SIZE_LG:
+ return 'fa-lg';
+ case Icon::SIZE_2x:
+ return 'fa-2x';
+ case Icon::SIZE_3x:
+ return 'fa-3x';
+ case Icon::SIZE_4x:
+ return 'fa-4x';
+ case Icon::SIZE_5x:
+ return 'fa-5x';
+ case Icon::SIZE_6x:
+ return 'fa-6x';
+ case Icon::SIZE_7x:
+ return 'fa-7x';
+ case Icon::SIZE_8x:
+ return 'fa-8x';
+ case Icon::SIZE_9x:
+ return 'fa-9x';
+ case Icon::SIZE_10x:
+ return 'fa-10x';
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getNames()
+ {
+ return Icon::$names;
+ }
+}
\ No newline at end of file
diff --git a/protected/humhub/modules/ui/icon/components/IconFactory.php b/protected/humhub/modules/ui/icon/components/IconFactory.php
new file mode 100644
index 0000000000..f244ea850a
--- /dev/null
+++ b/protected/humhub/modules/ui/icon/components/IconFactory.php
@@ -0,0 +1,149 @@
+ static::class]);
+ }
+
+ return static::$instance;
+ }
+
+ /**
+ * Adds a provider to this factory, if `$isDefault` is set to true the current default IconProvider
+ * will be overwritten.
+ *
+ * @param IconProvider $instance
+ */
+ public static function registerProvider(IconProvider $instance, $isDefault = false)
+ {
+ static::$provider[$instance->getId()] = $instance;
+ if($isDefault) {
+ static::$defaultProvider = $instance;
+ }
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function init()
+ {
+ $fontAwesomeIconProvider = new FontAwesomeIconProvider();
+ static::registerProvider($fontAwesomeIconProvider, true);
+ static::$fallbackProvider = $fontAwesomeIconProvider;
+ $this->trigger(static::EVENT_AFTER_INIT);
+ }
+
+ /**
+ * @param $icon
+ * @param array $options
+ * @see IconProvider::render()
+ * @return mixed
+ */
+ public function render($icon, $options = [])
+ {
+ $result = $this->getProvider($icon->lib)->render($icon, $options);
+ if(empty($result)) {
+ $result = static::$fallbackProvider->render($icon, $options);
+ }
+
+ return $result;
+ }
+
+ /**
+ * @param string|null $providerId icon provider id
+ * @return IconProvider
+ */
+ public function getProvider($providerId = null)
+ {
+ if(empty($providerId)) {
+ return static::$defaultProvider;
+ }
+
+ if(!isset(static::$provider[$providerId])) {
+ Yii::warning(Yii::t('UiModule.icon', 'No icon provider registered for provider id {id}', ['id' => $providerId]));
+ return static::$defaultProvider;
+ }
+
+ return static::$provider[$providerId];
+ }
+
+ /**
+ *
+ * @param $listDefinition
+ * @param null $providerId
+ * @see IconProvider::renderList()
+ * @return mixed
+ */
+ public function renderList($listDefinition, $providerId = null)
+ {
+ $result = $this->getProvider($providerId)->renderList($listDefinition);
+ if(empty($result)) {
+ $result = static::$fallbackProvider->renderList($listDefinition);
+ }
+
+ return $result;
+ }
+
+ /**
+ * Returns the supported icon names of the IconProvider
+ *
+ * @param null $providerId
+ * @see IconProvider::getNames()
+ * @return string[]
+ */
+ public function getNames($providerId = null)
+ {
+ return $this->getProvider($providerId)->getNames();
+ }
+}
\ No newline at end of file
diff --git a/protected/humhub/modules/ui/icon/components/IconProvider.php b/protected/humhub/modules/ui/icon/components/IconProvider.php
new file mode 100644
index 0000000000..50cf5bda16
--- /dev/null
+++ b/protected/humhub/modules/ui/icon/components/IconProvider.php
@@ -0,0 +1,62 @@
+ true]);
+ *
+ * IconFactory::render(['name' => 'task', 'fixedWith' => true]);
+ *
+ * IconFactory::render(new Icon(['name' => 'task', 'fixedWith' => true]));
+ * ```
+ *
+ * > Note: If the provider does not support a specific icon name or feature it should return null.
+ *
+ * @param $icon string|Icon|[]|null either an icon name, icon instance or icon array definition
+ * @return mixed
+ */
+ public function render($icon, $options = []);
+
+ /**
+ * Renders a icon list:
+ *
+ * = IconFactory::renderList([
+ * ['task' => 'My List Item 1', 'options' => []],
+ * ['tachometer' => 'My List Item 2', 'options' => []]
+ * ]); ?>
+ *
+ * > Note: If the provider does not support this feature, it should return null.
+ *
+ * @param $listDefinition
+ * @return $
+ */
+ public function renderList($listDefinition);
+
+ /**
+ * Return all supported icon names.
+ * @return string[]
+ */
+ public function getNames();
+
+}
\ No newline at end of file
diff --git a/protected/humhub/modules/ui/icon/widgets/Icon.php b/protected/humhub/modules/ui/icon/widgets/Icon.php
new file mode 100644
index 0000000000..73469c2c69
--- /dev/null
+++ b/protected/humhub/modules/ui/icon/widgets/Icon.php
@@ -0,0 +1,946 @@
+ 'danger']);
+ *
+ * // Use another icon lib
+ * Icon::get('myIcon', ['lib' => 'myIconLib']);
+ * ```
+ *
+ * @see IconFactory
+ * @see IconProvider
+ * @since 1.4
+ */
+class Icon extends \humhub\components\Widget
+{
+ const SIZE_XS = 'xs';
+ const SIZE_SM = 'sm';
+ const SIZE_LG = 'lg';
+ const SIZE_2x = '2x';
+ const SIZE_3x = '3x';
+ const SIZE_4x = '4x';
+ const SIZE_5x = '5x';
+ const SIZE_6x = '6x';
+ const SIZE_7x = '7x';
+ const SIZE_8x = '8x';
+ const SIZE_9x = '9x';
+ const SIZE_10x = '10x';
+
+ /**
+ * @var array contains all available names which should be supported by the main icon provider
+ */
+ public static $names = [
+ 'adjust',
+ 'adn',
+ 'align-center',
+ 'align-justify',
+ 'align-left',
+ 'align-right',
+ 'ambulance',
+ 'anchor',
+ 'android',
+ 'angellist',
+ 'angle-double-down',
+ 'angle-double-left',
+ 'angle-double-right',
+ 'angle-double-up',
+ 'angle-down',
+ 'angle-left',
+ 'angle-right',
+ 'angle-up',
+ 'apple',
+ 'archive',
+ 'area-chart',
+ 'arrow-circle-down',
+ 'arrow-circle-left',
+ 'arrow-circle-o-down',
+ 'arrow-circle-o-left',
+ 'arrow-circle-o-right',
+ 'arrow-circle-o-up',
+ 'arrow-circle-right',
+ 'arrow-circle-up',
+ 'arrow-down',
+ 'arrow-left',
+ 'arrow-right',
+ 'arrow-up',
+ 'arrows',
+ 'arrows-alt',
+ 'arrows-h',
+ 'arrows-v',
+ 'asterisk',
+ 'at',
+ 'backward',
+ 'ban',
+ 'bank',
+ 'bar-chart',
+ 'bar-chart-o',
+ 'barcode',
+ 'bars',
+ 'bed',
+ 'beer',
+ 'behance',
+ 'behance-square',
+ 'bell',
+ 'bell-o',
+ 'bell-slash',
+ 'bell-slash-o',
+ 'bicycle',
+ 'binoculars',
+ 'birthday-cake',
+ 'bitbucket',
+ 'bitbucket-square',
+ 'bitcoin',
+ 'bold',
+ 'bolt',
+ 'bomb',
+ 'book',
+ 'bookmark',
+ 'bookmark-o',
+ 'briefcase',
+ 'btc',
+ 'bug',
+ 'building',
+ 'building-o',
+ 'bullhorn',
+ 'bullseye',
+ 'bus',
+ 'buysellads',
+ 'cab',
+ 'calculator',
+ 'calendar',
+ 'calendar-o',
+ 'camera',
+ 'camera-retro',
+ 'car',
+ 'caret-down',
+ 'caret-left',
+ 'caret-right',
+ 'caret-square-o-down',
+ 'caret-square-o-left',
+ 'caret-square-o-right',
+ 'caret-square-o-up',
+ 'caret-up',
+ 'cart-arrow-down',
+ 'cart-plus',
+ 'cc',
+ 'cc-amex',
+ 'cc-discover',
+ 'cc-mastercard',
+ 'cc-paypal',
+ 'cc-stripe',
+ 'cc-visa',
+ 'certificate',
+ 'chain',
+ 'chain-broken',
+ 'check',
+ 'check-circle',
+ 'check-circle-o',
+ 'check-square',
+ 'check-square-o',
+ 'chevron-circle-down',
+ 'chevron-circle-left',
+ 'chevron-circle-right',
+ 'chevron-circle-up',
+ 'chevron-down',
+ 'chevron-left',
+ 'chevron-right',
+ 'chevron-up',
+ 'child',
+ 'circle',
+ 'circle-o',
+ 'circle-o-notch',
+ 'circle-thin',
+ 'clipboard',
+ 'clock-o',
+ 'close',
+ 'cloud',
+ 'cloud-download',
+ 'cloud-upload',
+ 'cny',
+ 'code',
+ 'code-fork',
+ 'codepen',
+ 'coffee',
+ 'cog',
+ 'cogs',
+ 'columns',
+ 'comment',
+ 'comment-o',
+ 'comments',
+ 'comments-o',
+ 'compass',
+ 'compress',
+ 'connectdevelop',
+ 'copy',
+ 'copyright',
+ 'credit-card',
+ 'crop',
+ 'crosshairs',
+ 'css3',
+ 'cube',
+ 'cubes',
+ 'cut',
+ 'cutlery',
+ 'dashboard',
+ 'dashcube',
+ 'database',
+ 'dedent',
+ 'delicious',
+ 'desktop',
+ 'deviantart',
+ 'diamond',
+ 'digg',
+ 'dollar',
+ 'dot-circle-o',
+ 'download',
+ 'dribbble',
+ 'dropbox',
+ 'drupal',
+ 'edit',
+ 'eject',
+ 'ellipsis-h',
+ 'ellipsis-v',
+ 'empire',
+ 'envelope',
+ 'envelope-o',
+ 'envelope-square',
+ 'eraser',
+ 'eur',
+ 'euro',
+ 'exchange',
+ 'exclamation',
+ 'exclamation-circle',
+ 'exclamation-triangle',
+ 'expand',
+ 'external-link',
+ 'external-link-square',
+ 'eye',
+ 'eye-slash',
+ 'eyedropper',
+ 'facebook',
+ 'facebook-f',
+ 'facebook-official',
+ 'facebook-square',
+ 'fast-backward',
+ 'fast-forward',
+ 'fax',
+ 'female',
+ 'fighter-jet',
+ 'file',
+ 'file-archive-o',
+ 'file-audio-o',
+ 'file-code-o',
+ 'file-excel-o',
+ 'file-image-o',
+ 'file-movie-o',
+ 'file-o',
+ 'file-pdf-o',
+ 'file-photo-o',
+ 'file-picture-o',
+ 'file-powerpoint-o',
+ 'file-sound-o',
+ 'file-text',
+ 'file-text-o',
+ 'file-video-o',
+ 'file-word-o',
+ 'file-zip-o',
+ 'files-o',
+ 'film',
+ 'filter',
+ 'fire',
+ 'fire-extinguisher',
+ 'flag',
+ 'flag-checkered',
+ 'flag-o',
+ 'flash',
+ 'flask',
+ 'flickr',
+ 'floppy-o',
+ 'folder',
+ 'folder-o',
+ 'folder-open',
+ 'folder-open-o',
+ 'font',
+ 'forumbee',
+ 'forward',
+ 'foursquare',
+ 'frown-o',
+ 'futbol-o',
+ 'gamepad',
+ 'gavel',
+ 'gbp',
+ 'ge',
+ 'gear',
+ 'gears',
+ 'genderless',
+ 'gift',
+ 'git',
+ 'git-square',
+ 'github',
+ 'github-alt',
+ 'github-square',
+ 'gittip',
+ 'glass',
+ 'globe',
+ 'google',
+ 'google-plus',
+ 'google-plus-square',
+ 'google-wallet',
+ 'graduation-cap',
+ 'gratipay',
+ 'group',
+ 'h-square',
+ 'hacker-news',
+ 'hand-o-down',
+ 'hand-o-left',
+ 'hand-o-right',
+ 'hand-o-up',
+ 'hdd-o',
+ 'header',
+ 'headphones',
+ 'heart',
+ 'heart-o',
+ 'heartbeat',
+ 'history',
+ 'home',
+ 'hospital-o',
+ 'hotel',
+ 'html5',
+ 'ils',
+ 'image',
+ 'inbox',
+ 'indent',
+ 'info',
+ 'info-circle',
+ 'inr',
+ 'instagram',
+ 'institution',
+ 'ioxhost',
+ 'italic',
+ 'joomla',
+ 'jpy',
+ 'jsfiddle',
+ 'key',
+ 'keyboard-o',
+ 'krw',
+ 'language',
+ 'laptop',
+ 'lastfm',
+ 'lastfm-square',
+ 'leaf',
+ 'leanpub',
+ 'legal',
+ 'lemon-o',
+ 'level-down',
+ 'level-up',
+ 'life-bouy',
+ 'life-buoy',
+ 'life-ring',
+ 'life-saver',
+ 'lightbulb-o',
+ 'line-chart',
+ 'link',
+ 'linkedin',
+ 'linkedin-square',
+ 'linux',
+ 'list',
+ 'list-alt',
+ 'list-ol',
+ 'list-ul',
+ 'location-arrow',
+ 'lock',
+ 'long-arrow-down',
+ 'long-arrow-left',
+ 'long-arrow-right',
+ 'long-arrow-up',
+ 'magic',
+ 'magnet',
+ 'mail-forward',
+ 'mail-reply',
+ 'mail-reply-all',
+ 'male',
+ 'map-marker',
+ 'mars',
+ 'mars-double',
+ 'mars-stroke',
+ 'mars-stroke-h',
+ 'mars-stroke-v',
+ 'maxcdn',
+ 'meanpath',
+ 'medium',
+ 'medkit',
+ 'meh-o',
+ 'mercury',
+ 'microphone',
+ 'microphone-slash',
+ 'minus',
+ 'minus-circle',
+ 'minus-square',
+ 'minus-square-o',
+ 'mobile',
+ 'mobile-phone',
+ 'money',
+ 'moon-o',
+ 'mortar-board',
+ 'motorcycle',
+ 'music',
+ 'navicon',
+ 'neuter',
+ 'newspaper-o',
+ 'openid',
+ 'outdent',
+ 'pagelines',
+ 'paint-brush',
+ 'paper-plane',
+ 'paper-plane-o',
+ 'paperclip',
+ 'paragraph',
+ 'paste',
+ 'pause',
+ 'paw',
+ 'paypal',
+ 'pencil',
+ 'pencil-square',
+ 'pencil-square-o',
+ 'phone',
+ 'phone-square',
+ 'photo',
+ 'picture-o',
+ 'pie-chart',
+ 'pied-piper',
+ 'pied-piper-alt',
+ 'pinterest',
+ 'pinterest-p',
+ 'pinterest-square',
+ 'plane',
+ 'play',
+ 'play-circle',
+ 'play-circle-o',
+ 'plug',
+ 'plus',
+ 'plus-circle',
+ 'plus-square',
+ 'plus-square-o',
+ 'power-off',
+ 'print',
+ 'puzzle-piece',
+ 'qq',
+ 'qrcode',
+ 'question',
+ 'question-circle',
+ 'quote-left',
+ 'quote-right',
+ 'ra',
+ 'random',
+ 'rebel',
+ 'recycle',
+ 'reddit',
+ 'reddit-square',
+ 'refresh',
+ 'remove',
+ 'renren',
+ 'reorder',
+ 'repeat',
+ 'reply',
+ 'reply-all',
+ 'retweet',
+ 'rmb',
+ 'road',
+ 'rocket',
+ 'rotate-left',
+ 'rotate-right',
+ 'rouble',
+ 'rss',
+ 'rss-square',
+ 'rub',
+ 'ruble',
+ 'rupee',
+ 'save',
+ 'scissors',
+ 'search',
+ 'search-minus',
+ 'search-plus',
+ 'sellsy',
+ 'send',
+ 'send-o',
+ 'server',
+ 'share',
+ 'share-alt',
+ 'share-alt-square',
+ 'share-square',
+ 'share-square-o',
+ 'shekel',
+ 'sheqel',
+ 'shield',
+ 'ship',
+ 'shirtsinbulk',
+ 'shopping-cart',
+ 'sign-in',
+ 'sign-out',
+ 'signal',
+ 'simplybuilt',
+ 'sitemap',
+ 'skyatlas',
+ 'skype',
+ 'slack',
+ 'sliders',
+ 'slideshare',
+ 'smile-o',
+ 'soccer-ball-o',
+ 'sort',
+ 'sort-alpha-asc',
+ 'sort-alpha-desc',
+ 'sort-amount-asc',
+ 'sort-amount-desc',
+ 'sort-asc',
+ 'sort-desc',
+ 'sort-down',
+ 'sort-numeric-asc',
+ 'sort-numeric-desc',
+ 'sort-up',
+ 'soundcloud',
+ 'space-shuttle',
+ 'spinner',
+ 'spoon',
+ 'spotify',
+ 'square',
+ 'square-o',
+ 'stack-exchange',
+ 'stack-overflow',
+ 'star',
+ 'star-half',
+ 'star-half-empty',
+ 'star-half-full',
+ 'star-half-o',
+ 'star-o',
+ 'steam',
+ 'steam-square',
+ 'step-backward',
+ 'step-forward',
+ 'stethoscope',
+ 'stop',
+ 'street-view',
+ 'strikethrough',
+ 'stumbleupon',
+ 'stumbleupon-circle',
+ 'subscript',
+ 'subway',
+ 'suitcase',
+ 'sun-o',
+ 'superscript',
+ 'support',
+ 'table',
+ 'tablet',
+ 'tachometer',
+ 'tag',
+ 'tags',
+ 'tasks',
+ 'taxi',
+ 'tencent-weibo',
+ 'terminal',
+ 'text-height',
+ 'text-width',
+ 'th',
+ 'th-large',
+ 'th-list',
+ 'thumb-tack',
+ 'thumbs-down',
+ 'thumbs-o-down',
+ 'thumbs-o-up',
+ 'thumbs-up',
+ 'ticket',
+ 'times',
+ 'times-circle',
+ 'times-circle-o',
+ 'tint',
+ 'toggle-off',
+ 'toggle-on',
+ 'train',
+ 'transgender',
+ 'transgender-alt',
+ 'trash',
+ 'trash-o',
+ 'tree',
+ 'trello',
+ 'trophy',
+ 'truck',
+ 'try',
+ 'tty',
+ 'tumblr',
+ 'tumblr-square',
+ 'twitch',
+ 'twitter',
+ 'twitter-square',
+ 'umbrella',
+ 'underline',
+ 'undo',
+ 'university',
+ 'unlock',
+ 'unlock-alt',
+ 'upload',
+ 'usd',
+ 'user',
+ 'user-md',
+ 'user-plus',
+ 'user-secret',
+ 'user-times',
+ 'users',
+ 'venus',
+ 'venus-double',
+ 'venus-mars',
+ 'viacoin',
+ 'video-camera',
+ 'vimeo-square',
+ 'vine',
+ 'vk',
+ 'volume-down',
+ 'volume-off',
+ 'volume-up',
+ 'weibo',
+ 'weixin',
+ 'whatsapp',
+ 'wheelchair',
+ 'wifi',
+ 'windows',
+ 'wordpress',
+ 'wrench',
+ 'xing',
+ 'xing-square',
+ 'yahoo',
+ 'yelp',
+ 'youtube',
+ 'youtube-play',
+ 'youtube-square'
+ ];
+
+ /**
+ * @var string icon name
+ */
+ public $name;
+
+ /**
+ * @var int icon size in pixel
+ */
+ public $size;
+
+ /**
+ * @var bool right float
+ */
+ public $right = false;
+
+ /**
+ * @var bool left float
+ */
+ public $left = false;
+
+ /**
+ * @var bool used to vertical alignment of icons;
+ */
+ public $fixedWidth = false;
+
+ /**
+ * @var bool used for icon list items
+ */
+ public $listItem = false;
+
+ /**
+ * @var bool bordered icon
+ */
+ public $border = false;
+
+ /**
+ * Set this to true if the icon is only used for decoration and is not required for navigating your site.
+ * @var bool used for accessibility, set this to true if the icon is just used as decoration and
+ */
+ public $ariaHidden = false;
+
+ /**
+ * @var array
+ */
+ public $htmlOptions = [];
+
+ /**
+ * @var string css color
+ */
+ public $color;
+
+ /**
+ * @var string explicitly define a icon library, if not defined the default icon provider is used
+ */
+ public $lib;
+
+
+ /**
+ * Can be used to get an Icon instance from an unknown format.
+ *
+ * The following formats are supported:
+ *
+ * ```php
+ * // Will just return the given $instance
+ * Icon::get($instance);
+ *
+ * // Will overwrite the instance configuration and return the given $instane
+ * Icon::get($instance, $someOptions);
+ *
+ *
+ * // Will create an instance with the given icon name and options
+ * Icon::get('tasks', $someOptoins);
+ *
+ *
+ * // Will create an instance from the given options array
+ * Icon::get(['name' => 'tasks', color => 'success']);
+ * ```
+ * @param $icon
+ * @param array $options
+ * @return Icon|null|object
+ */
+ public static function get($icon, $options = [])
+ {
+ if($icon instanceof static) {
+ return Yii::configure($icon, $options);
+ } else if(is_string($icon)) {
+ $options['name'] = $icon;
+ return new Icon($options);
+ } else if(is_array($icon)) {
+ return new Icon($icon);
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns all supported icon names of a provider-
+ *
+ * @param null $providerId
+ * @return string[]
+ * @see IconFactory::getNames()
+ * @throws \yii\base\InvalidConfigException
+ */
+ public static function getNames($providerId = null)
+ {
+ return IconFactory::getInstance()->getNames($providerId);
+ }
+
+ /**
+ * Renders a icon list e.g.:
+ *
+ * ```php
+ * Icon::renderList([
+ * ['tasks' => 'First list item', 'options' => ['color' => 'success']],
+ * ['book' => 'First second item', 'options' => ['color' => 'danger']]
+ * ])
+ * ```
+ *
+ * @param $listDefinition
+ * @return mixed
+ * @throws \yii\base\InvalidConfigException
+ */
+ public static function renderList($listDefinition)
+ {
+ return IconFactory::getInstance()->renderList($listDefinition);
+ }
+
+ /**
+ * @inheritdoc
+ * @throws \yii\base\InvalidConfigException
+ */
+ public function run()
+ {
+ /**
+ * Catch for legacy icon usage
+ */
+ $this->name = (strpos($this->name, 'fa-') === 0)
+ ? substr($this->name, 3, strlen($this->name))
+ : $this->name;
+
+ if($this->color) {
+ switch($this->color) {
+ case 'default':
+ $this->color = $this->view->theme->variable('default');
+ break;
+ case 'primary':
+ $this->color = $this->view->theme->variable('primary');
+ break;
+ case 'info':
+ $this->color = $this->view->theme->variable('info');
+ break;
+ case 'success':
+ $this->color = $this->view->theme->variable('success');
+ break;
+ case 'warning':
+ case 'warn':
+ $this->color = $this->view->theme->variable('warn');
+ break;
+
+ case 'error':
+ case 'danger':
+ $this->color = $this->view->theme->variable('danger');
+ break;
+
+ }
+ }
+
+ if($this->id) {
+ $this->htmlOptions['id'] = $this->id;
+ }
+
+ return IconFactory::getInstance()->render($this);
+ }
+
+ /**
+ * @param $size string
+ * @return $this
+ */
+ public function size($size)
+ {
+ $this->size = $size;
+ return $this;
+ }
+
+ /**
+ * @param bool $active
+ * @return $this
+ */
+ public function fixedWith($active = true)
+ {
+ $this->fixedWidth = $active;
+ return $this;
+ }
+
+ /**
+ * @param bool $active
+ * @return $this
+ */
+ public function listItem($active = true)
+ {
+ $this->listItem;
+ return $this;
+ }
+
+ /**
+ * @param bool $active
+ * @return $this
+ */
+ public function right($active = true)
+ {
+ if($active) {
+ $this->left(false);
+ }
+
+ $this->right = $active;
+ return $this;
+ }
+
+ /**
+ * @param bool $active
+ * @return $this
+ */
+ public function left($active = true)
+ {
+ if($active) {
+ $this->right(false);
+ }
+
+ $this->left = $active;
+ return $this;
+ }
+
+ /**
+ * @param bool $active
+ */
+ public function ariaHidden($active = true)
+ {
+ $this->ariaHidden = $active;
+ return $this;
+ }
+
+ /**
+ * @param bool $active
+ * @return $this
+ */
+ public function border($active = true)
+ {
+ $this->border = $active;
+ return $this;
+ }
+
+ /**
+ * @param string|array $style
+ */
+ public function style($style)
+ {
+ Html::addCssStyle($this->htmlOptions, $style);
+ return $this;
+ }
+
+ /**
+ * @param string $color
+ */
+ public function color($color)
+ {
+ $this->color = $color;
+ return $this;
+ }
+
+ /**
+ * @param $lib
+ * @return $this
+ */
+ public function lib($lib)
+ {
+ $this->lib = $lib;
+ return $this;
+ }
+
+ /**
+ * @return [] array representation of this icon
+ */
+ public function asArray()
+ {
+ return [
+ 'id' => $this->id,
+ 'name' => $this->name,
+ 'size' => $this->size,
+ 'fixedWidth' => $this->fixedWidth,
+ 'listItem' => $this->listItem,
+ 'right' => $this->right,
+ 'left' => $this->left,
+ 'ariaHidden' => $this->ariaHidden,
+ 'border' => $this->border,
+ 'htmlOptions' => $this->htmlOptions,
+ 'color' => $this->color,
+ 'lib' => $this->lib
+ ];
+ }
+
+ /**
+ * @return string
+ * @throws \Exception
+ */
+ public function __toString()
+ {
+ $result = $this::widget($this->asArray());
+
+ return $result ? $result : '';
+ }
+}
\ No newline at end of file
diff --git a/protected/humhub/modules/ui/menu/DropdownDivider.php b/protected/humhub/modules/ui/menu/DropdownDivider.php
new file mode 100644
index 0000000000..98ab51db79
--- /dev/null
+++ b/protected/humhub/modules/ui/menu/DropdownDivider.php
@@ -0,0 +1,38 @@
+addEntry(new DropdownDivider(['sortOrder' => 100]);
+ * ```
+ *
+ * @since 1.4
+ * @see Menu
+ */
+class DropdownDivider extends MenuEntry
+{
+ /**
+ * @inheritdoc
+ */
+ public function renderEntry($extraHtmlOptions = [])
+ {
+ Html::addCssClass($extraHtmlOptions, 'divider');
+ return Html::tag('li', '', $this->getHtmlOptions($extraHtmlOptions));
+ }
+}
diff --git a/protected/humhub/modules/ui/menu/MenuEntry.php b/protected/humhub/modules/ui/menu/MenuEntry.php
new file mode 100644
index 0000000000..62e97f0730
--- /dev/null
+++ b/protected/humhub/modules/ui/menu/MenuEntry.php
@@ -0,0 +1,247 @@
+getHtmlOptions($extraHtmlOptions));
+ *
+ * ```
+ *
+ * @param array $extraHtmlOptions
+ * @return string the Html link
+ */
+ abstract protected function renderEntry($extraHtmlOptions = []);
+
+ /**
+ * Public accessible render function responsible for rendering this entry.
+ *
+ * @param array $extraHtmlOptions
+ * @return string
+ */
+ public function render($extraHtmlOptions = []) {
+ if(!$this->isVisible) {
+ return '';
+ }
+
+ return $this->renderEntry($extraHtmlOptions);
+ }
+
+ /**
+ * @return boolean is active
+ */
+ public function getIsActive()
+ {
+ if (is_callable($this->isActive)) {
+ call_user_func($this->isActive);
+ }
+
+ if ($this->isActive) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * @param $state boolean
+ * @return static
+ */
+ public function setIsActive($state)
+ {
+ $this->isActive = $state;
+ return $this;
+ }
+
+ /**
+ * Activates this MenuEntry in case the given moduleId, controllerId and actionId matches the current request.
+ * @param string $moduleId controller module id
+ * @param array|string $controllerIds controller id
+ * @param array|string $actionIds action id
+ * @return static
+ */
+ public function setIsActiveState($moduleId, $controllerIds = [], $actionIds = [])
+ {
+
+ $this->isActive = static::isActiveState($moduleId,$controllerIds,$actionIds);
+ return $this;
+ }
+
+ public static function isActiveState($moduleId = null, $controllerIds = [], $actionIds = [])
+ {
+ if($moduleId && (!Yii::$app->controller->module || Yii::$app->controller->module->id !== $moduleId)) {
+ return false;
+ }
+
+ if(empty($controllerIds) && empty($actionIds)) {
+ return true;
+ }
+
+ if($controllerIds && !is_array($controllerIds)) {
+ $controllerIds = [$controllerIds];
+ }
+
+ if(!empty($controllerIds) && !in_array(Yii::$app->controller->id, $controllerIds)) {
+ return false;
+ }
+
+ if($actionIds && !is_array($actionIds)) {
+ $actionIds = [$actionIds];
+ }
+
+ if(!empty($actionIds) && !in_array(Yii::$app->controller->action->id, $actionIds)) {
+ return false;
+ }
+
+ return true;
+ }
+
+
+ /**
+ * @param $id string the id
+ * @return static
+ */
+ public function setId($id)
+ {
+ $this->id = $id;
+ return $this;
+ }
+
+ /**
+ * @return string the id
+ */
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ /**
+ * Compares this entry with the given entry
+ * @param MenuEntry $entry
+ * @return bool
+ */
+ public function compare(MenuEntry $entry)
+ {
+ return !empty($this->getId()) && $this->getId() === $entry->getId();
+ }
+
+ /**
+ * Returns the Html options for the menu entry link tag.
+ *
+ * @return array
+ */
+ public function getHtmlOptions($extraOptions = [])
+ {
+ $options = $this->htmlOptions;
+
+ if(isset($extraOptions['class'])) {
+ Html::addCssClass($options, $extraOptions['class']);
+ }
+
+ if(isset($extraOptions['style'])) {
+ Html::addCssStyle($options, $extraOptions['style']);
+ }
+
+ if ($this->isActive) {
+ Html::addCssClass($options, 'active');
+ }
+
+ return array_merge($extraOptions, $options);
+ }
+
+ /**
+ * @param array $htmlOptions
+ * @return static
+ */
+ public function setHtmlOptions($htmlOptions)
+ {
+ $this->htmlOptions = $htmlOptions;
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isVisible()
+ {
+ return $this->isVisible;
+ }
+
+ /**
+ * @param bool $isVisible
+ * @return static
+ */
+ public function setIsVisible($isVisible)
+ {
+ $this->isVisible = $isVisible;
+ return $this;
+ }
+
+ /**
+ * @return int
+ */
+ public function getSortOrder()
+ {
+ return $this->sortOrder;
+ }
+
+ /**
+ * @param int $sortOrder
+ * @return static
+ */
+ public function setSortOrder($sortOrder)
+ {
+ $this->sortOrder = $sortOrder;
+ return $this;
+ }
+}
diff --git a/protected/humhub/modules/ui/menu/MenuLink.php b/protected/humhub/modules/ui/menu/MenuLink.php
new file mode 100644
index 0000000000..e2520869b9
--- /dev/null
+++ b/protected/humhub/modules/ui/menu/MenuLink.php
@@ -0,0 +1,275 @@
+link) {
+ return $this->link.'';
+ }
+
+ return Html::a(
+ $this->getIcon() . ' ' . $this->getLabel(),
+ $this->getUrl(),
+ $this->getHtmlOptions($extraHtmlOptions)
+ );
+ }
+
+ public function getHtmlOptions($extraOptions = [])
+ {
+ $options = parent::getHtmlOptions($extraOptions);
+
+ if(!$this->pjaxEnabled) {
+ Html::addPjaxPrevention($options);
+ }
+
+ return array_merge($extraOptions, $options);
+ }
+
+ public function compare(MenuEntry $entry)
+ {
+ return parent::compare($entry) || ($entry instanceof self && $this->getUrl() === $entry->getUrl());
+ }
+
+ /**
+ * @param $label string the label
+ * @return static
+ */
+ public function setLabel($label)
+ {
+ $this->label = $label;
+ return $this;
+ }
+
+ /**
+ * @return Link
+ */
+ public function getLink()
+ {
+ return $this->link;
+ }
+
+ /**
+ * @param $link Link the label
+ * @return static
+ */
+ public function setLink(Link $link)
+ {
+ $this->link = $link;
+ return $this;
+ }
+
+ /**
+ * @return string the label
+ */
+ public function getLabel()
+ {
+ return $this->label;
+ }
+
+ /**
+ * @return Icon the icon
+ */
+ public function getIcon()
+ {
+ return $this->icon;
+ }
+
+ /**
+ * @param $icon Icon|string the icon instance or icon name
+ * * @return static
+ */
+ public function setIcon($icon)
+ {
+ $this->icon = Icon::get($icon);
+ return $this;
+ }
+
+ /**
+ * Sets the URL
+ *
+ * @param $url array|string
+ * @return static
+ */
+ public function setUrl($url)
+ {
+ $this->url = $url;
+ return $this;
+ }
+
+ /**
+ * Returns the URL
+ *
+ * @param bool $asString return the URL as string
+ * @return array|string
+ */
+ public function getUrl($asString = true)
+ {
+ if ($asString) {
+ return Url::to($this->url);
+ }
+
+ return $this->url;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isPjaxEnabled()
+ {
+ return $this->pjaxEnabled;
+ }
+
+ /**
+ * @param bool $pjaxEnabled
+ * @return static
+ */
+ public function setPjaxEnabled($pjaxEnabled)
+ {
+ $this->pjaxEnabled = $pjaxEnabled;
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ public function getBadgeText()
+ {
+ return $this->badgeText;
+ }
+
+ /**
+ * @param string $badgeText
+ * @return static
+ */
+ public function setBadgeText($badgeText)
+ {
+ $this->badgeText = $badgeText;
+ return $this;
+ }
+
+ /**
+ * Creates MenuEntry by old and deprecated array structure
+ *
+ * @deprecated since 1.4
+ * @param $item
+ * @return MenuLink
+ */
+ public static function createByArray($item)
+ {
+ $entry = new static;
+
+ if (isset($item['id'])) {
+ $entry->id = $item['id'];
+ }
+
+ if (isset($item['label'])) {
+ $entry->label = $item['label'];
+ }
+
+ if (isset($item['icon'])) {
+ $entry->icon = $item['icon'];
+ }
+
+ if (isset($item['url'])) {
+ $entry->url = $item['url'];
+ }
+
+ if (isset($item['sortOrder'])) {
+ $entry->sortOrder = $item['sortOrder'];
+ }
+
+ if (isset($item['isActive'])) {
+ $entry->isActive = $item['isActive'];
+ }
+
+ if (isset($item['htmlOptions'])) {
+ $entry->isActive = $item['htmlOptions'];
+ }
+
+ return $entry;
+ }
+
+ /**
+ * Returns the MenuEntry as array structure
+ *
+ * @deprecated since 1.4
+ * @return array the menu entry array representation
+ */
+ public function toArray()
+ {
+ if (!isset($this->htmlOptions['class'])) {
+ $this->htmlOptions['class'] = '';
+ }
+
+ return [
+ 'label' => $this->label,
+ 'id' => $this->id,
+ 'icon' => $this->icon,
+ 'url' => $this->url,
+ 'sortOrder' => $this->sortOrder,
+ 'isActive' => $this->isActive,
+ 'htmlOptions' => $this->htmlOptions
+ ];
+ }
+
+}
diff --git a/protected/humhub/modules/ui/menu/events/MenuEvent.php b/protected/humhub/modules/ui/menu/events/MenuEvent.php
new file mode 100644
index 0000000000..ca330d0565
--- /dev/null
+++ b/protected/humhub/modules/ui/menu/events/MenuEvent.php
@@ -0,0 +1,24 @@
+ 'btn-group dropdown-navigation'
+ ];
+ }
+
+}
diff --git a/protected/humhub/modules/ui/menu/widgets/LeftNavigation.php b/protected/humhub/modules/ui/menu/widgets/LeftNavigation.php
new file mode 100644
index 0000000000..f0461ac6ea
--- /dev/null
+++ b/protected/humhub/modules/ui/menu/widgets/LeftNavigation.php
@@ -0,0 +1,29 @@
+entries[] = $entry;
+ }
+
+ /**
+ * Removes the entry from the navigation
+ *
+ * @param MenuEntry $entry
+ * @return boolean
+ */
+ public function removeEntry($entry)
+ {
+ foreach ($this->entries as $i => $e) {
+ if ($e === $entry) {
+ unset($this->entries[$i]);
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Executes the navigation widget.
+ *
+ * @return string the result of navigation widget execution to be outputted.
+ */
+ public function run()
+ {
+ $this->trigger(static::EVENT_RUN);
+
+ if (empty($this->template)) {
+ return '';
+ }
+
+ return $this->render($this->template, $this->getViewParams());
+ }
+
+ /**
+ * Returns the parameters which are passed to the view template
+ *
+ * @return array the view parameters
+ */
+ protected function getViewParams()
+ {
+ return [
+ 'menu' => $this,
+ 'entries' => $this->getSortedEntries(),
+ 'options' => $this->getOptions(),
+ // Deprecated
+ 'items' => $this->getItems(),
+ 'numItems' => count($this->getItems())
+ ];
+ }
+
+ /**
+ * Sorts the entry list by sortOrder and returns the sorted entry list.
+ *
+ * @return MenuEntry[]
+ */
+ public function getSortedEntries()
+ {
+ return Sort::sort($this->entries);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getData()
+ {
+ return [
+ 'menu-id' => $this->id
+ ];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getAttributes()
+ {
+ return [
+ 'class' => 'panel panel-default left-navigation'
+ ];
+ }
+
+ /**
+ * Returns the first entry with the given URL
+ *
+ * @param $url string|array the url or route
+ * @return MenuLink
+ */
+ public function getEntryByUrl($url)
+ {
+ if (is_array($url)) {
+ $url = Url::to($url);
+ }
+
+ foreach ($this->entries as $entry) {
+ if(!$entry instanceof MenuLink) {
+ continue;
+ }
+
+ if ($entry->getUrl() === $url) {
+ return $entry;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns the first active menu entry
+ *
+ * @return MenuEntry
+ */
+ public function getActiveEntry()
+ {
+ foreach ($this->entries as $entry) {
+ if ($entry->getIsActive()) {
+ return $entry;
+ }
+ }
+ }
+
+ /**
+ * Sets an menu entry active and inactive all other entries
+ *
+ * @param MenuEntry $entry
+ */
+ public function setEntryActive(MenuEntry $entry)
+ {
+ foreach ($this->entries as $currentEntry) {
+ $currentEntry->setIsActive(($currentEntry->compare($entry)));
+ }
+ }
+
+ /**
+ * -------------------------------------------------------------------
+ * Compatibility Layer
+ * -------------------------------------------------------------------
+ */
+
+ /**
+ * @deprecated since 1.4
+ * @param array $entryArray
+ */
+ public function addItem($entryArray)
+ {
+ $entry = MenuLink::createByArray($entryArray);
+ $this->addEntry($entry);
+ }
+
+ /**
+ * @deprecated since 1.4 not longer supported!
+ * @return array item group
+ */
+ public function addItemGroup($itemGroup)
+ {
+ //throw new InvalidCallException('Item groups are not longer supported');
+ }
+
+ /**
+ * @deprecated since 1.4
+ * @return array the item group
+ */
+ public function getItemGroups()
+ {
+ return [
+ ['id' => 'default', 'label' => '', 'icon' => '', 'sortOrder' => 1000]
+ ];
+ }
+
+ /**
+ * @deprecated since 1.4
+ * @return array the menu items as array list
+ */
+ public function getItems($group = '')
+ {
+ $items = [];
+ foreach ($this->entries as $entry) {
+ if($entry instanceof MenuLink) {
+ $items[] = $entry->toArray();
+ }
+ }
+ return $items;
+ }
+
+ /**
+ * Returns all entries filtered by $type. If no $type filter is given all entries
+ * are returned.
+ *
+ * If $filterVisible is set, only visible entries will be returned
+ *
+ * @param null|string $type
+ * @param bool $filterVisible
+ * @return MenuEntry[]
+ */
+ public function getEntries($type = null, $filterVisible = false)
+ {
+ $result = [];
+ foreach ($this->getSortedEntries() as $entry) {
+ if((!$filterVisible || $entry->isVisible()) && (!$type || get_class($entry) === $type || is_subclass_of($entry, $type))) {
+ $result[] = $entry;
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * @param null $type
+ * @param bool $filterVisible
+ * @return MenuEntry|null
+ */
+ public function getFirstEntry($type = null, $filterVisible = false)
+ {
+ $entries = $this->getEntries($type, $filterVisible);
+ if(count($entries)) {
+ return $entries[0];
+ }
+
+ return null;
+ }
+
+ /**
+ * Checks if this menu contains multiple entries of the given $type, or at all if no $type filter is given.
+ *
+ * @param null $type
+ * @return bool
+ */
+ public function hasMultipleEntries($type = null)
+ {
+ return count($this->getEntries($type)) > 1;
+ }
+
+ /**
+ * @deprecated since 1.4
+ */
+ public function setActive($url)
+ {
+ $entry = $this->getEntryByUrl($url);
+ if ($entry) {
+ $this->setEntryActive($entry);
+ }
+ }
+
+ /**
+ * @deprecated since 1.4
+ */
+ public function setInactive($url)
+ {
+ $entry = $this->getEntryByUrl($url);
+ if ($entry) {
+ $entry->setIsActive(false);
+ }
+ }
+
+ /**
+ * @deprecated since 1.4
+ */
+ public static function markAsActive($url)
+ {
+ Event::on(static::class, static::EVENT_RUN, function ($event) use ($url) {
+ $event->sender->setActive($url);
+ });
+ }
+
+ /**
+ * @deprecated since 1.4
+ */
+ public static function markAsInactive($url)
+ {
+ Event::on(static::class, static::EVENT_RUN, function ($event) use ($url) {
+ $event->sender->setInactive($url);
+ });
+ }
+
+ /**
+ * @deprecated since 1.4
+ * @return array the menu entry as array
+ */
+ public function getActive()
+ {
+ $activeEntry = $this->getActiveEntry();
+ if ($activeEntry && $activeEntry instanceof MenuLink) {
+ return $activeEntry->toArray();
+ }
+
+ return null;
+ }
+
+ /**
+ * @deprecated since 1.4
+ * @param $url string the URL or route
+ */
+ public function deleteItemByUrl($url)
+ {
+ $entry = $this->getEntryByUrl($url);
+ if ($entry) {
+ $this->removeEntry($entry);
+ }
+ }
+
+ /**
+ * @deprecated since 1.4
+ */
+ public static function setViewState()
+ {
+ $instance = new static();
+ if (!empty($instance->id)) {
+ $active = $instance->getActive();
+ $instance->view->registerJs('humhub.modules.ui.navigation.setActive("' . $instance->id . '", ' . json_encode($active) . ');', View::POS_END, 'active-' . $instance->id);
+ }
+ }
+
+}
diff --git a/protected/humhub/modules/ui/menu/widgets/SubTabMenu.php b/protected/humhub/modules/ui/menu/widgets/SubTabMenu.php
new file mode 100644
index 0000000000..f0461fd1fd
--- /dev/null
+++ b/protected/humhub/modules/ui/menu/widgets/SubTabMenu.php
@@ -0,0 +1,39 @@
+ 'nav nav-tabs tab-sub-menu'
+ ];
+ }
+
+}
diff --git a/protected/humhub/modules/ui/menu/widgets/TabMenu.php b/protected/humhub/modules/ui/menu/widgets/TabMenu.php
new file mode 100644
index 0000000000..316e5b5c35
--- /dev/null
+++ b/protected/humhub/modules/ui/menu/widgets/TabMenu.php
@@ -0,0 +1,50 @@
+renderSingleTab && !$this->hasMultipleEntries(MenuLink::class)) {
+ return '';
+ }
+
+ return parent::render($view, $params);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getAttributes()
+ {
+ return [
+ 'class' => 'tab-menu'
+ ];
+ }
+
+}
diff --git a/protected/humhub/modules/ui/menu/widgets/views/dropdown-menu.php b/protected/humhub/modules/ui/menu/widgets/views/dropdown-menu.php
new file mode 100644
index 0000000000..46d20b61ce
--- /dev/null
+++ b/protected/humhub/modules/ui/menu/widgets/views/dropdown-menu.php
@@ -0,0 +1,26 @@
+
+
+= Html::beginTag('div', $options)?>
+
+
+
+= Html::endTag('div')?>
\ No newline at end of file
diff --git a/protected/humhub/modules/ui/menu/widgets/views/left-navigation.php b/protected/humhub/modules/ui/menu/widgets/views/left-navigation.php
new file mode 100644
index 0000000000..e36374665f
--- /dev/null
+++ b/protected/humhub/modules/ui/menu/widgets/views/left-navigation.php
@@ -0,0 +1,21 @@
+
+
+= Html::beginTag('div', $options) ?>
+ panelTitle)) : ?>
+ = $menu->panelTitle; ?>
+
+
+
+
+ = $entry->render(['class' => 'list-group-item']) ?>
+
+
+= Html::endTag('div') ?>
diff --git a/protected/humhub/modules/ui/menu/widgets/views/sub-tab-menu.php b/protected/humhub/modules/ui/menu/widgets/views/sub-tab-menu.php
new file mode 100644
index 0000000000..4a5a9598c5
--- /dev/null
+++ b/protected/humhub/modules/ui/menu/widgets/views/sub-tab-menu.php
@@ -0,0 +1,17 @@
+
+
+= Html::beginTag('ul', $options)?>
+
+ getIsActive()): ?>class="active">
+ = $entry->render() ?>
+
+
+= Html::endTag('ul')?>
diff --git a/protected/humhub/modules/ui/menu/widgets/views/tab-menu.php b/protected/humhub/modules/ui/menu/widgets/views/tab-menu.php
new file mode 100644
index 0000000000..936076a35d
--- /dev/null
+++ b/protected/humhub/modules/ui/menu/widgets/views/tab-menu.php
@@ -0,0 +1,19 @@
+
+
+= Html::beginTag('div', $options)?>
+
+
+ - getIsActive()): ?>class="active">
+ = $entry->render() ?>
+
+
+
+= Html::endTag('div')?>
diff --git a/protected/humhub/modules/ui/widgets/Icon.php b/protected/humhub/modules/ui/widgets/Icon.php
deleted file mode 100644
index 8b4618cff3..0000000000
--- a/protected/humhub/modules/ui/widgets/Icon.php
+++ /dev/null
@@ -1,55 +0,0 @@
-name . '">';
- }
-
-
- /**
- * @inheritdoc
- */
- public function run()
- {
- return $this->renderHtml();
- }
-
- /**
- * @return string returns the Html tag for this icon
- */
- public function __toString()
- {
- return $this->renderHtml();
- }
-
-}
diff --git a/protected/humhub/modules/user/widgets/AccountMenu.php b/protected/humhub/modules/user/widgets/AccountMenu.php
index e381f659de..1b8fa2cefd 100644
--- a/protected/humhub/modules/user/widgets/AccountMenu.php
+++ b/protected/humhub/modules/user/widgets/AccountMenu.php
@@ -9,8 +9,8 @@
namespace humhub\modules\user\widgets;
use Yii;
-use \humhub\widgets\BaseMenu;
-use \yii\helpers\Url;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\ui\menu\widgets\LeftNavigation;
/**
* AccountMenuWidget as (usally left) navigation on users account options.
@@ -19,82 +19,66 @@ use \yii\helpers\Url;
* @since 0.5
* @author Luke
*/
-class AccountMenu extends BaseMenu
+class AccountMenu extends LeftNavigation
{
- public $template = "@humhub/widgets/views/leftNavigation";
- public $type = "accountNavigation";
-
+ /**
+ * @inheritdoc
+ */
public function init()
{
+ $this->panelTitle = Yii::t('UserModule.widgets_AccountMenuWidget', 'Account settings');
- $controllerAction = Yii::$app->controller->action->id;
- $this->addItemGroup([
- 'id' => 'account',
- 'label' => Yii::t('UserModule.widgets_AccountMenuWidget', 'Account settings'),
- 'sortOrder' => 100,
- ]);
-
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('UserModule.widgets_AccountMenuWidget', 'Profile'),
- 'icon' => '',
- 'group' => 'account',
- 'url' => Url::toRoute('/user/account/edit'),
+ 'icon' => 'user',
+ 'url' => ['/user/account/edit'],
'sortOrder' => 100,
- 'isActive' => ($controllerAction == "edit" || $controllerAction == "change-email" || $controllerAction == "change-password" || $controllerAction == "delete"),
- ]);
+ 'isActive' => MenuLink::isActiveState('user', 'account', ['edit', 'change-email', 'change-password', 'delete'])
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('UserModule.account', 'E-Mail Summaries'),
- 'icon' => '',
- 'group' => 'account',
- 'url' => Url::toRoute('/activity/user'),
+ 'icon' => 'envelope',
+ 'url' => ['/activity/user'],
'sortOrder' => 105,
- 'isActive' => (Yii::$app->controller->module->id == 'activity'),
- ]);
-
- $this->addItem([
+ 'isActive' => MenuLink::isActiveState('activity')
+ ]));
+
+ $this->addEntry(new MenuLink([
'label' => Yii::t('UserModule.account', 'Notifications'),
- 'icon' => '',
- 'group' => 'account',
- 'url' => Url::toRoute('/notification/user'),
+ 'icon' => 'bell',
+ 'url' => ['/notification/user'],
'sortOrder' => 106,
- 'isActive' => (Yii::$app->controller->module->id == 'notification'),
- ]);
+ 'isActive' => MenuLink::isActiveState('notification')
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('UserModule.widgets_AccountMenuWidget', 'Settings'),
- 'icon' => '',
- 'group' => 'account',
- 'url' => Url::toRoute('/user/account/edit-settings'),
+ 'icon' => 'wrench',
+ 'url' => ['/user/account/edit-settings'],
'sortOrder' => 110,
- 'isActive' => ($controllerAction == "edit-settings"),
- ]);
+ 'isActive' => MenuLink::isActiveState('user', 'account', 'edit-settings')
+ ]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('UserModule.widgets_AccountMenuWidget', 'Security'),
- 'icon' => '',
- 'group' => 'account',
- 'url' => Url::toRoute('/user/account/security'),
+ 'icon' => 'lock',
+ 'url' => ['/user/account/security'],
'sortOrder' => 115,
- 'isActive' => (Yii::$app->controller->action->id == "security"),
- ]);
+ 'isActive' => MenuLink::isActiveState('user', 'account', 'security')
+ ]));
- // Only show this page when really user specific modules available
- if (count(Yii::$app->user->getIdentity()->getAvailableModules()) != 0) {
- $this->addItem([
- 'label' => Yii::t('UserModule.widgets_AccountMenuWidget', 'Modules'),
- 'icon' => '',
- 'group' => 'account',
- 'url' => Url::toRoute('//user/account/edit-modules'),
- 'sortOrder' => 120,
- 'isActive' => (Yii::$app->controller->action->id == "edit-modules"),
- ]);
- }
+ $this->addEntry(new MenuLink([
+ 'label' => Yii::t('UserModule.widgets_AccountMenuWidget', 'Modules'),
+ 'icon' => 'rocket',
+ 'url' => ['/user/account/edit-modules'],
+ 'sortOrder' => 120,
+ 'isActive' => MenuLink::isActiveState('user', 'account', 'edit-modules'),
+ 'isVisible' => (count(Yii::$app->user->getIdentity()->getAvailableModules()) !== 0)
+ ]));
parent::init();
}
}
-
-?>
diff --git a/protected/humhub/modules/user/widgets/AccountProfilMenu.php b/protected/humhub/modules/user/widgets/AccountProfilMenu.php
index 0ce00cbb8c..5dfa225519 100644
--- a/protected/humhub/modules/user/widgets/AccountProfilMenu.php
+++ b/protected/humhub/modules/user/widgets/AccountProfilMenu.php
@@ -9,30 +9,26 @@
namespace humhub\modules\user\widgets;
use Yii;
-use yii\helpers\Url;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\ui\menu\widgets\TabMenu;
/**
* Account Settings Tab Menu
*/
-class AccountProfilMenu extends \humhub\widgets\BaseMenu
+class AccountProfilMenu extends TabMenu
{
- /**
- * @inheritdoc
- */
- public $template = "@humhub/widgets/views/tabMenu";
-
/**
* @inheritdoc
*/
public function init()
{
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('UserModule.base', 'General'),
- 'url' => Url::toRoute(['/user/account/edit']),
+ 'url' => ['/user/account/edit'],
'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'user' && Yii::$app->controller->id == 'account' && Yii::$app->controller->action->id == 'edit'),
- ]);
+ 'isActive' => MenuLink::isActiveState('user', 'account', 'edit')
+ ]));
if (Yii::$app->user->canChangeUsername()) {
$this->addItem([
@@ -51,32 +47,38 @@ class AccountProfilMenu extends \humhub\widgets\BaseMenu
'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'user' && Yii::$app->controller->id == 'account' && (Yii::$app->controller->action->id == 'change-email' || Yii::$app->controller->action->id == 'change-email-validate')),
]);
}
+ $this->addEntry(new MenuLink([
+ 'label' => Yii::t('UserModule.base', 'Change Email'),
+ 'url' => ['/user/account/change-email'],
+ 'sortOrder' => 200,
+ 'isActive' => MenuLink::isActiveState('user', 'account', ['change-email', 'change-email-validate']),
+ 'isVisible' => Yii::$app->user->canChangeEmail()
+ ]));
- if (Yii::$app->user->canChangePassword()) {
- $this->addItem([
- 'label' => Yii::t('UserModule.base', 'Change Password'),
- 'url' => Url::toRoute(['/user/account/change-password']),
- 'sortOrder' => 400,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'user' && Yii::$app->controller->id == 'account' && Yii::$app->controller->action->id == 'change-password'),
- ]);
- }
+ $this->addEntry(new MenuLink([
+ 'label' => Yii::t('UserModule.base', 'Change Password'),
+ 'url' => ['/user/account/change-password'],
+ 'sortOrder' => 400,
+ 'isActive' => MenuLink::isActiveState('user', 'account', 'change-password'),
+ 'isVisible' => Yii::$app->user->canChangePassword()
+ ]));
- if (Yii::$app->user->canDeleteAccount()) {
- $this->addItem([
- 'label' => Yii::t('UserModule.base', 'Delete Account'),
- 'url' => Url::toRoute(['/user/account/delete']),
- 'sortOrder' => 500,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'user' && Yii::$app->controller->id == 'account' && Yii::$app->controller->action->id == 'delete'),
- ]);
- }
+ $this->addEntry(new MenuLink([
+ 'label' => Yii::t('UserModule.base', 'Delete Account'),
+ 'url' => ['/user/account/delete'],
+ 'sortOrder' => 500,
+ 'isActive' => MenuLink::isActiveState('user', 'account', 'delete'),
+ 'isVisible' => Yii::$app->user->canDeleteAccount()
+ ]));
parent::init();
}
/**
* Returns optional authclients
- *
+ *
* @return \yii\authclient\ClientInterface[]
+ * @throws \yii\base\InvalidConfigException
*/
protected function getSecondoaryAuthProviders()
{
diff --git a/protected/humhub/modules/user/widgets/AccountSettingsMenu.php b/protected/humhub/modules/user/widgets/AccountSettingsMenu.php
index 4cddeb6be9..a6b7b8adcb 100644
--- a/protected/humhub/modules/user/widgets/AccountSettingsMenu.php
+++ b/protected/humhub/modules/user/widgets/AccountSettingsMenu.php
@@ -9,48 +9,46 @@
namespace humhub\modules\user\widgets;
use Yii;
-use yii\helpers\Url;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\ui\menu\widgets\TabMenu;
/**
* Account Settings Tab Menu
*/
-class AccountSettingsMenu extends \humhub\widgets\BaseMenu
+class AccountSettingsMenu extends TabMenu
{
/**
* @inheritdoc
- */
- public $template = "@humhub/widgets/views/tabMenu";
-
- /**
- * @inheritdoc
+ * @throws \yii\base\InvalidConfigException
*/
public function init()
{
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('UserModule.base', 'Basic Settings'),
- 'url' => Url::toRoute(['/user/account/edit-settings']),
+ 'url' => ['/user/account/edit-settings'],
'sortOrder' => 100,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'user' && Yii::$app->controller->id == 'account' && Yii::$app->controller->action->id == 'edit-settings'),
- ]);
+ 'isActive' => MenuLink::isActiveState('user', 'account', 'edit-settings')
+ ]));
+
+ $this->addEntry(new MenuLink([
+ 'label' => Yii::t('UserModule.base', 'Connected Accounts'),
+ 'url' => ['/user/account/connected-accounts'],
+ 'sortOrder' => 300,
+ 'isActive' => MenuLink::isActiveState('user', 'account', 'connected-accounts'),
+ 'isVisible' => count($this->getSecondaryAuthProviders()) !== 0
+ ]));
- if (count($this->getSecondaryAuthProviders()) != 0) {
- $this->addItem([
- 'label' => Yii::t('UserModule.base', 'Connected Accounts'),
- 'url' => Url::toRoute(['/user/account/connected-accounts']),
- 'sortOrder' => 300,
- 'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'user' && Yii::$app->controller->id == 'account' && Yii::$app->controller->action->id == 'connected-accounts'),
- ]);
- }
parent::init();
}
/**
* Returns optional authclients
- *
+ *
* @return \yii\authclient\ClientInterface[]
+ * @throws \yii\base\InvalidConfigException
*/
protected function getSecondaryAuthProviders()
{
diff --git a/protected/humhub/modules/user/widgets/AccountTopMenu.php b/protected/humhub/modules/user/widgets/AccountTopMenu.php
index d6bb5c936a..d008af75f2 100644
--- a/protected/humhub/modules/user/widgets/AccountTopMenu.php
+++ b/protected/humhub/modules/user/widgets/AccountTopMenu.php
@@ -8,17 +8,21 @@
namespace humhub\modules\user\widgets;
+use humhub\modules\ui\menu\DropdownDivider;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\ui\menu\widgets\Menu;
use Yii;
use yii\helpers\Url;
-use humhub\widgets\BaseMenu;
+use humhub\modules\admin\widgets\AdminMenu;
/**
* AccountTopMenu Widget
*
* @author luke
*/
-class AccountTopMenu extends BaseMenu
+class AccountTopMenu extends Menu
{
+ public $id = 'account-top-menu';
/**
* @var boolean show user name
@@ -40,50 +44,54 @@ class AccountTopMenu extends BaseMenu
}
$user = Yii::$app->user->getIdentity();
- $this->addItem([
+
+ $this->addEntry(new MenuLink([
'label' => Yii::t('base', 'My profile'),
- 'icon' => '',
+ 'icon' => 'user',
'url' => $user->createUrl('/user/profile/home'),
- 'sortOrder' => 100,
- ]);
- $this->addItem([
+ 'sortOrder' => 100]));
+
+ $this->addEntry(new MenuLink([
'label' => Yii::t('base', 'Account settings'),
- 'icon' => '',
+ 'icon' => 'edit',
'url' => Url::toRoute('/user/account/edit'),
'sortOrder' => 200,
- ]);
+ ]));
- if (\humhub\modules\admin\widgets\AdminMenu::canAccess()) {
- $this->addItem([
- 'label' => '---',
- 'url' => '#',
- 'sortOrder' => 300,
- ]);
+ if (AdminMenu::canAccess()) {
+ $this->addEntry(new DropdownDivider(['sortOrder' => 300]));
- $this->addItem([
+
+ $this->addEntry(new MenuLink([
'label' => Yii::t('base', 'Administration'),
- 'icon' => '',
+ 'icon' => 'cogs',
'url' => Url::toRoute('/admin'),
'sortOrder' => 400,
- ]);
+ ]));
}
- $this->addItem([
- 'label' => '---',
- 'url' => '#',
- 'sortOrder' => 600,
- ]);
+ $this->addEntry(new DropdownDivider(['sortOrder' => 600]));
- $this->addItem([
+ $this->addEntry(new MenuLink([
'label' => Yii::t('base', 'Logout'),
'id' => 'account-logout',
- 'icon' => '',
- 'pjax' => false,
+ 'icon' => 'sign-out',
+ 'pjaxEnabled' => false,
'url' => Url::toRoute('/user/auth/logout'),
'sortOrder' => 700,
- ]);
+ ]));
parent::init();
}
+ /**
+ * @inheritdoc
+ */
+ public function getAttributes()
+ {
+ return [
+ 'class' => 'nav'
+ ];
+ }
+
}
diff --git a/protected/humhub/modules/user/widgets/ProfileMenu.php b/protected/humhub/modules/user/widgets/ProfileMenu.php
index 1fd5844c5f..dd79dc0570 100644
--- a/protected/humhub/modules/user/widgets/ProfileMenu.php
+++ b/protected/humhub/modules/user/widgets/ProfileMenu.php
@@ -9,6 +9,8 @@
namespace humhub\modules\user\widgets;
use Yii;
+use humhub\modules\ui\menu\MenuLink;
+use humhub\modules\ui\menu\widgets\LeftNavigation;
use humhub\modules\user\models\User;
use humhub\modules\user\permissions\ViewAboutPage;
@@ -24,7 +26,7 @@ use humhub\modules\user\permissions\ViewAboutPage;
* @since 0.5
* @author Luke
*/
-class ProfileMenu extends \humhub\widgets\BaseMenu
+class ProfileMenu extends LeftNavigation
{
/**
@@ -32,39 +34,33 @@ class ProfileMenu extends \humhub\widgets\BaseMenu
*/
public $user;
- /**
- * @inheritdoc
- */
- public $template = "@humhub/widgets/views/leftNavigation";
/**
* @inheritdoc
*/
public function init()
{
- $this->addItemGroup([
- 'id' => 'profile',
- 'label' => Yii::t('UserModule.widgets_ProfileMenuWidget', 'Profile menu'),
- 'sortOrder' => 100,
- ]);
- $this->addItem([
+ $this->panelTitle = Yii::t('UserModule.widgets_ProfileMenuWidget', 'Profile menu');
+
+ $this->addEntry(new MenuLink([
'label' => Yii::t('UserModule.widgets_ProfileMenuWidget', 'Stream'),
- 'icon' => '',
+ 'icon' => 'bars',
'url' => $this->user->createUrl('//user/profile/home'),
'sortOrder' => 200,
- 'isActive' => (Yii::$app->controller->id == "profile" && (Yii::$app->controller->action->id == "index" || Yii::$app->controller->action->id == "home")),
- ]);
+ 'isActive' => MenuLink::isActiveState('user', 'profile', ['index', 'home'])
+ ]));
+
+
+ $this->addEntry(new MenuLink([
+ 'label' => Yii::t('UserModule.widgets_ProfileMenuWidget', 'About'),
+ 'icon' => 'info-circle>',
+ 'url' => $this->user->createUrl('/user/profile/about'),
+ 'sortOrder' => 300,
+ 'isActive' => MenuLink::isActiveState('user', 'profile', 'about'),
+ 'isVisible' => $this->user->permissionManager->can(ViewAboutPage::class)
+ ]));
- if ($this->user->permissionManager->can(new ViewAboutPage())) {
- $this->addItem([
- 'label' => Yii::t('UserModule.widgets_ProfileMenuWidget', 'About'),
- 'icon' => '',
- 'url' => $this->user->createUrl('//user/profile/about'),
- 'sortOrder' => 300,
- 'isActive' => (Yii::$app->controller->id == "profile" && Yii::$app->controller->action->id == "about"),
- ]);
- }
parent::init();
}
@@ -74,7 +70,7 @@ class ProfileMenu extends \humhub\widgets\BaseMenu
public function run()
{
if (Yii::$app->user->isGuest && $this->user->visibility != User::VISIBILITY_ALL) {
- return;
+ return '';
}
return parent::run();
diff --git a/protected/humhub/modules/user/widgets/views/accountTopMenu.php b/protected/humhub/modules/user/widgets/views/accountTopMenu.php
index 4ff63ba02d..83d876fd71 100755
--- a/protected/humhub/modules/user/widgets/views/accountTopMenu.php
+++ b/protected/humhub/modules/user/widgets/views/accountTopMenu.php
@@ -9,6 +9,12 @@
use humhub\widgets\FooterMenu;
use \yii\helpers\Html;
use \yii\helpers\Url;
+use humhub\modules\user\widgets\Image;
+
+/* @var $this \humhub\components\View */
+/* @var $menu \humhub\modules\ui\menu\widgets\DropdownMenu */
+/* @var $entries \humhub\modules\ui\menu\MenuEntry[] */
+/* @var $options [] */
/** @var \humhub\modules\user\models\User $userModel */
$userModel = Yii::$app->user->getIdentity();
@@ -22,7 +28,7 @@ $userModel = Yii::$app->user->getIdentity();
-
+ = Html::endTag('ul') ?>
diff --git a/protected/humhub/widgets/BaseMenu.php b/protected/humhub/widgets/BaseMenu.php
index 27122fee34..3064c6ba5c 100644
--- a/protected/humhub/widgets/BaseMenu.php
+++ b/protected/humhub/widgets/BaseMenu.php
@@ -8,352 +8,16 @@
namespace humhub\widgets;
-use Yii;
-use yii\base\Widget;
-use yii\helpers\Url;
-use yii\base\Event;
-use yii\web\View;
+
+use humhub\modules\ui\menu\widgets\Menu;
/**
* BaseMenu is the base class for navigations.
+ *
+ * @deprecated since 1.4
+ * @see Menu
*/
-class BaseMenu extends Widget
+class BaseMenu extends Menu
{
- const EVENT_INIT = 'init';
- const EVENT_RUN = 'run';
-
- /**
- *
- * @var array of items
- */
- public $items = [];
-
- /**
- *
- * @var array of item groups
- */
- public $itemGroups = [];
-
- /**
- *
- * @var string type of the navigation, optional for identifing.
- */
- public $type = '';
-
- /**
- * @var string dom element id
- * @since 1.2
- */
- public $id;
-
- /**
- * Template of the navigation
- *
- * Available default template views:
- * - leftNavigation
- * - tabMenu
- *
- * @var string template file
- */
- public $template;
-
- /**
- * Initializes the navigation widget.
- * This method mainly normalizes the {@link items} property.
- * If this method is overridden, make sure the parent implementation is invoked.
- */
- public function init()
- {
- $this->addItemGroup([
- 'id' => '',
- 'label' => ''
- ]);
-
- // Yii 2.0.11 introduced own init event
- if (version_compare(Yii::getVersion(), '2.0.11', '<')) {
- $this->trigger(self::EVENT_INIT);
- }
-
- return parent::init();
- }
-
- /**
- * Adds new Item to the menu
- *
- * @param array $item
- * with item definitions
- */
- public function addItem($item)
- {
- if (!isset($item['label'])) {
- $item['label'] = 'Unnamed';
- }
-
- if (!isset($item['url'])) {
- $item['url'] = '#';
- }
-
- if (!isset($item['icon'])) {
- $item['icon'] = '';
- }
-
- if (!isset($item['group'])) {
- $item['group'] = '';
- }
-
- if (!isset($item['htmlOptions'])) {
- $item['htmlOptions'] = [];
- }
-
- if (!isset($item['pjax'])) {
- $item['pjax'] = true;
- }
-
- /**
- *
- * @deprecated since version 0.11 use directly htmlOptions instead
- */
- if (isset($item['target'])) {
- $item['htmlOptions']['target'] = $item['target'];
- }
-
- if (!isset($item['sortOrder'])) {
- $item['sortOrder'] = 1000;
- }
-
- if (!isset($item['newItemCount'])) {
- $item['newItemCount'] = 0;
- }
-
- if (!isset($item['isActive'])) {
- $item['isActive'] = false;
- }
- if (isset($item['isVisible']) && !$item['isVisible']) {
- return;
- }
-
- // Build Item CSS Class
- if (!isset($item['htmlOptions']['class'])) {
- $item['htmlOptions']['class'] = '';
- }
-
- if ($item['isActive']) {
- $item['htmlOptions']['class'] .= ' active';
- }
-
- if (isset($item['id'])) {
- $item['htmlOptions']['class'] .= ' ' . $item['id'];
- }
-
- $this->items[] = $item;
- }
-
- /**
- * Adds new Item Group to the menu
- *
- * @param array $itemGroup
- * with group definition
- */
- public function addItemGroup($itemGroup)
- {
- if (!isset($itemGroup['id'])) {
- $itemGroup['id'] = 'default';
- }
-
- if (!isset($itemGroup['label'])) {
- $itemGroup['label'] = 'Unnamed';
- }
-
- if (!isset($itemGroup['icon'])) {
- $itemGroup['icon'] = '';
- }
-
- if (!isset($itemGroup['sortOrder'])) {
- $itemGroup['sortOrder'] = 1000;
- }
-
- if (isset($itemGroup['isVisible']) && !$itemGroup['isVisible']) {
- return;
- }
-
- $this->itemGroups[] = $itemGroup;
- }
-
- /**
- * Returns Items of this Navigation
- *
- * @param string $group
- * limits the items to a specified group
- * @return array a list of items with definition
- */
- public function getItems($group = '')
- {
- $this->sortItems();
-
- $ret = [];
-
- foreach ($this->items as $item) {
- if ($group == $item['group'])
- $ret[] = $item;
- }
-
- return $ret;
- }
-
- /**
- * Sorts the item attribute by sortOrder
- */
- private function sortItems()
- {
- usort($this->items, function ($a, $b) {
- if ($a['sortOrder'] == $b['sortOrder']) {
- return 0;
- } elseif ($a['sortOrder'] < $b['sortOrder']) {
- return - 1;
- } else {
- return 1;
- }
- });
- }
-
- /**
- * Sorts Item Groups by sortOrder Field
- */
- private function sortItemGroups()
- {
- usort($this->itemGroups, function ($a, $b) {
- if ($a['sortOrder'] == $b['sortOrder']) {
- return 0;
- } elseif ($a['sortOrder'] < $b['sortOrder']) {
- return - 1;
- } else {
- return 1;
- }
- });
- }
-
- /**
- * Returns all Item Groups
- *
- * @return array of item group definitions
- */
- public function getItemGroups()
- {
- $this->sortItemGroups();
- return $this->itemGroups;
- }
-
- /**
- * Executes the Menu Widget
- */
- public function run()
- {
- $this->trigger(self::EVENT_RUN);
-
- if (empty($this->template)) {
- return;
- }
-
- return $this->render($this->template, []);
- }
-
- /**
- * Activates the menu item with the given url
- * @param type $url
- */
- public function setActive($url)
- {
- foreach ($this->items as $key => $item) {
- if ($item['url'] == $url) {
- $this->items[$key]['htmlOptions']['class'] = 'active';
- $this->items[$key]['isActive'] = true;
- $this->view->registerJs('humhub.modules.ui.navigation.setActive("' . $this->id . '", ' . json_encode($this->items[$key]) . ');', View::POS_END, 'active-' . $this->id);
- }
- }
- }
-
- public function getActive()
- {
- foreach ($this->items as $item) {
- if ($item['isActive']) {
- return $item;
- }
- }
- }
-
- /*
- * Deactivates the menu item with the given url
- */
-
- public function setInactive($url)
- {
- foreach ($this->items as $key => $item) {
- if ($item['url'] == $url) {
- $this->items[$key]['htmlOptions']['class'] = '';
- $this->items[$key]['isActive'] = false;
- }
- }
- }
-
- /**
- * Add the active class from a menue item.
- *
- * @param string $url
- * the URL of the item to mark. You can use Url::toRoute(...) to generate it.
- */
- public static function markAsActive($url)
- {
- if (is_array($url)) {
- $url = Url::to($url);
- }
-
- Event::on(static::className(), static::EVENT_RUN, function ($event) use ($url) {
- $event->sender->setActive($url);
- });
- }
-
- /**
- * This function is used in combination with pjax to get sure the required menu is active
- */
- public static function setViewState()
- {
- $instance = new static();
- if (!empty($instance->id)) {
- $active = $instance->getActive();
- $instance->view->registerJs('humhub.modules.ui.navigation.setActive("' . $instance->id . '", ' . json_encode($active) . ');', \yii\web\View::POS_END, 'active-' . $instance->id);
- }
- }
-
- /**
- * Remove the active class from a menue item.
- *
- * @param string $url
- * the URL of the item to mark. You can use Url::toRoute(...) to generate it.
- */
- public static function markAsInactive($url)
- {
- if (is_array($url)) {
- $url = Url::to($url);
- }
-
- Event::on(static::className(), static::EVENT_RUN, function ($event) use ($url) {
- $event->sender->setInactive($url);
- });
- }
-
- /**
- * Removes Item by URL
- *
- * @param string $url
- */
- public function deleteItemByUrl($url)
- {
- foreach ($this->items as $key => $item) {
- if ($item['url'] == $url) {
- unset($this->items[$key]);
- }
- }
- }
-
}
diff --git a/protected/humhub/widgets/FooterMenu.php b/protected/humhub/widgets/FooterMenu.php
index 681de29679..2e986b8581 100644
--- a/protected/humhub/widgets/FooterMenu.php
+++ b/protected/humhub/widgets/FooterMenu.php
@@ -8,13 +8,15 @@
namespace humhub\widgets;
+use humhub\modules\ui\menu\widgets\Menu;
+
/**
* FooterMenu displays a footer navigation for pages e.g. Imprint
*
* @since 1.2.6
* @author Luke
*/
-class FooterMenu extends BaseMenu
+class FooterMenu extends Menu
{
const LOCATION_ACCOUNT_MENU = 'account_menu';
const LOCATION_LOGIN = 'login';
@@ -22,7 +24,6 @@ class FooterMenu extends BaseMenu
const LOCATION_FULL_PAGE = 'full';
const LOCATION_EMAIL = 'mail';
-
/**
* @var string location of footer menu (e.g. login, mail, sidebar)
*/
@@ -59,14 +60,11 @@ class FooterMenu extends BaseMenu
/**
* @inheritdoc
*/
- public function run()
+ protected function getViewParams()
{
- $this->trigger(self::EVENT_RUN);
-
- return $this->render($this->template, [
- 'items' => $this->getItems(),
- 'location' => $this->location,
- 'numItems' => count($this->getItems())
- ]);
+ $params = parent::getViewParams();
+ $params['location'] = $this->location;
+ return $params;
}
+
}
diff --git a/protected/humhub/widgets/TopMenu.php b/protected/humhub/widgets/TopMenu.php
index 20ed5e8054..a405b940f3 100644
--- a/protected/humhub/widgets/TopMenu.php
+++ b/protected/humhub/widgets/TopMenu.php
@@ -9,6 +9,7 @@
namespace humhub\widgets;
use Yii;
+use humhub\modules\ui\menu\widgets\Menu;
use humhub\modules\user\components\User;
/**
@@ -17,18 +18,19 @@ use humhub\modules\user\components\User;
* @since 0.5
* @author Luke
*/
-class TopMenu extends BaseMenu
+class TopMenu extends Menu
{
+ /**
+ * @inheritdoc
+ */
+ public $id = 'top-menu-nav';
+
/**
* @inheritdoc
*/
public $template = 'topNavigation';
- /**
- * @inheritdoc
- */
- public $id = 'top-menu-nav';
/**
* @inheritdoc
@@ -43,4 +45,6 @@ class TopMenu extends BaseMenu
}
}
+
+
}
diff --git a/protected/humhub/widgets/views/dropdownNavigation.php b/protected/humhub/widgets/views/dropdownNavigation.php
deleted file mode 100644
index 64f58f7310..0000000000
--- a/protected/humhub/widgets/views/dropdownNavigation.php
+++ /dev/null
@@ -1,32 +0,0 @@
-
-context->getItemGroups() as $group) : ?>
-
- context->getItems($group['id']); ?>
-
-
-
-
-
-
-
diff --git a/protected/humhub/widgets/views/leftNavigation.php b/protected/humhub/widgets/views/leftNavigation.php
deleted file mode 100644
index 53121f8c2e..0000000000
--- a/protected/humhub/widgets/views/leftNavigation.php
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
- context->getItemGroups() as $group) : ?>
-
- context->getItems($group['id']); ?>
-
-
-
-
-
-
-
-
- " . $item['label'] . "", $item['url'], $item['htmlOptions']); ?>
-
-
-
-
-
-
diff --git a/protected/humhub/widgets/views/subTabMenu.php b/protected/humhub/widgets/views/subTabMenu.php
deleted file mode 100644
index 69198582d2..0000000000
--- a/protected/humhub/widgets/views/subTabMenu.php
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
diff --git a/protected/humhub/widgets/views/tabMenu.php b/protected/humhub/widgets/views/tabMenu.php
deleted file mode 100644
index d1095c08d0..0000000000
--- a/protected/humhub/widgets/views/tabMenu.php
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
\ No newline at end of file
diff --git a/protected/humhub/widgets/views/topNavigation.php b/protected/humhub/widgets/views/topNavigation.php
index dd03d6e681..003c26a516 100755
--- a/protected/humhub/widgets/views/topNavigation.php
+++ b/protected/humhub/widgets/views/topNavigation.php
@@ -2,29 +2,28 @@
use yii\helpers\Html;
+/* @var $this \humhub\components\View */
+/* @var $menu \humhub\widgets\TopMenu */
+/* @var $entries \humhub\modules\ui\menu\MenuEntry[] */
?>
-context->getItems() as $item) : ?>
-
- " . $item['label'], $item['url'], $item['htmlOptions']); ?>
+
+
+
+ = Html::a($entry->getIcon() . '
' . $entry->getLabel(), $entry->getUrl(), $entry->getHtmlOptions()); ?>
+ = Yii::t('base', 'Menu'); ?>
+
+
-
\ No newline at end of file
+
diff --git a/static/js/humhub/humhub.ui.navigation.js b/static/js/humhub/humhub.ui.navigation.js
index 6c2cee31b1..558b67118d 100644
--- a/static/js/humhub/humhub.ui.navigation.js
+++ b/static/js/humhub/humhub.ui.navigation.js
@@ -1,6 +1,9 @@
humhub.module('ui.navigation', function (module, require, $) {
var event = require('event');
+ var Widget = require('ui.widget').Widget;
+
+ var Navigation = Widget.extend();
var init = function () {
module.initTopNav();
@@ -54,6 +57,7 @@ humhub.module('ui.navigation', function (module, require, $) {
init: init,
setActive: setActive,
initTopNav: initTopNav,
- setActiveItem: setActiveItem
+ setActiveItem: setActiveItem,
+ Navigation: Navigation
});
});
\ No newline at end of file
diff --git a/static/less/humhub.less b/static/less/humhub.less
index ce682978ad..52f17fbaad 100644
--- a/static/less/humhub.less
+++ b/static/less/humhub.less
@@ -189,6 +189,11 @@
@import "mobile.less";
}
+@prev-icon: false;
+& when not(@prev-icon) {
+ @import "icon.less";
+}
+
@import "../css/select2Theme/build.less";
// LEGACY/DEPRECATED User- & Space picker
diff --git a/static/less/icon.less b/static/less/icon.less
new file mode 100644
index 0000000000..488553bdc3
--- /dev/null
+++ b/static/less/icon.less
@@ -0,0 +1,41 @@
+.icon-sm, .fa-sm {
+ font-size: .875em;
+}
+
+.icon-lg, .fa-lg {
+ font-size: 1.33333em;
+ line-height: .75em;
+ vertical-align: -.0667em;
+}
+
+.icon-2x, .fa-2x {
+ font-size: 2em;
+}
+
+.icon-3x, .fa-3x {
+ font-size: 3em;
+}
+
+.icon-4x, .fa-4x {
+ font-size: 4em;
+}
+
+.icon-5x, .fa-5x {
+ font-size: 5em;
+}
+
+.icon-6x, .fa-6x {
+ font-size: 6em;
+}
+
+.icon-7x, .fa-7x {
+ font-size: 7em;
+}
+
+.icon-9x, .fa-9x {
+ font-size: 9em;
+}
+
+.icon-10x, .fa-10x {
+ font-size: 10em;
+}
diff --git a/themes/HumHub/css/theme.css b/themes/HumHub/css/theme.css
index de3d0e53b2..45b765a272 100644
--- a/themes/HumHub/css/theme.css
+++ b/themes/HumHub/css/theme.css
@@ -1 +1 @@
-.colorDefault{color:#ededed}.backgroundDefault{background:#ededed}.borderDefault{border-color:#ededed}.colorPrimary{color:#708fa0 !important}.backgroundPrimary{background:#708fa0 !important}.borderPrimary{border-color:#708fa0 !important}.colorInfo{color:#6fdbe8 !important}.backgroundInfo{background:#6fdbe8 !important}.borderInfo{border-color:#6fdbe8 !important}.colorSuccess{color:#97d271 !important}.backgroundSuccess{background:#97d271 !important}.borderSuccess{border-color:#97d271 !important}.colorWarning{color:#fdd198 !important}.backgroundWarning{background:#fdd198 !important}.borderWarning{border-color:#fdd198 !important}.colorDanger{color:#ff8989 !important}.backgroundDanger{background:#ff8989 !important}.borderDanger{border-color:#ff8989 !important}.colorFont1{color:#bac2c7 !important}.colorFont2{color:#7a7a7a !important}.colorFont3{color:#555 !important}.colorFont4{color:#bebebe !important}.colorFont5{color:#aeaeae !important}.heading{font-size:16px;font-weight:300;color:#555;background-color:white;border:none;padding:10px}.text-center{text-align:center !important}.text-break{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.img-rounded{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}body{padding-top:130px;background-color:#ededed;color:#777;font-family:'Open Sans',sans-serif}body a,body a:hover,body a:focus,body a:active,body a.active{color:#555;text-decoration:none}@media (max-width:920px){body{padding-top:115px}}@media (min-width:768px) and (max-width:920px){body{padding-top:120px}}a:hover{text-decoration:none}hr{margin-top:10px;margin-bottom:10px}.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{position:inherit}.layout-content-container,.layout-nav-container{padding:0 10px 0 15px}.layout-sidebar-container{padding:0 15px 0 5px}@media (max-width:768px){.layout-nav-container .left-navigation{margin-bottom:0px}.layout-nav-container,.layout-content-container{padding:0px 15px}}@media (min-width:768px) and (max-width:920px){#topbar-first .container,#topbar-second .container{padding-left:10px;padding-right:20px}}h4{font-weight:300;font-size:150%}input[type=text],input[type=password],input[type=select]{-webkit-appearance:none;-moz-appearance:none;appearance:none}.powered,.powered a{color:#b8c7d3 !important}.langSwitcher{display:inline-block}[data-ui-show-more]{overflow:hidden}.topbar{position:fixed;display:block;height:50px;width:100%;padding-left:15px;padding-right:15px}.topbar ul.nav{float:left}.topbar ul.nav>li{float:left}.topbar ul.nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}.topbar .dropdown-footer{margin:10px}.topbar .dropdown-header{font-size:16px;padding:3px 10px;margin-bottom:10px;font-weight:300;color:#bebebe}.topbar .dropdown-header .dropdown-header-link{position:absolute;top:2px;right:10px}.topbar .dropdown-header .dropdown-header-link a{color:#6fdbe8 !important;font-size:12px;font-weight:normal}.topbar .dropdown-header:hover{color:#bebebe}#topbar-first{background-color:#708fa0;top:0;z-index:1030;color:white}#topbar-first .nav>li>a:hover,#topbar-first .nav>.open>a{background-color:#8fa7b4}#topbar-first .nav>.account{height:50px;margin-left:20px}#topbar-first .nav>.account img{margin-left:10px}#topbar-first .nav>.account .dropdown-toggle{padding:10px 5px 8px;line-height:1.1em;text-align:left}#topbar-first .nav>.account .dropdown-toggle span{font-size:12px}#topbar-first .topbar-brand{position:relative;z-index:2}#topbar-first .topbar-actions{position:relative;z-index:3}#topbar-first .notifications{position:absolute;left:0;right:0;text-align:center;z-index:1}#topbar-first .notifications .btn-group{position:relative;text-align:left}#topbar-first .notifications .btn-group>a{padding:5px 10px;margin:10px 2px;display:inline-block;border-radius:2px;text-decoration:none;text-align:left}#topbar-first .notifications .btn-group>.label{position:absolute;top:4px;right:-2px}#topbar-first .notifications .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid;border-width:10px;content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff;z-index:1035}#topbar-first .notifications .arrow{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid;z-index:1001;border-width:11px;left:50%;margin-left:-18px;border-top-width:0;border-bottom-color:rgba(0,0,0,0.15);top:-19px;z-index:1035}#topbar-first .notifications .dropdown-menu{width:350px;margin-left:-148px}#topbar-first .notifications .dropdown-menu ul.media-list{max-height:400px;overflow:auto}#topbar-first .notifications .dropdown-menu li{position:relative}#topbar-first .notifications .dropdown-menu li i.approval{position:absolute;left:2px;top:36px;font-size:14px}#topbar-first .notifications .dropdown-menu li i.accepted{color:#5cb85c}#topbar-first .notifications .dropdown-menu li i.declined{color:#d9534f}#topbar-first .notifications .dropdown-menu li .media{position:relative}#topbar-first .notifications .dropdown-menu li .media .img-space{position:absolute;top:14px;left:14px}#topbar-first .dropdown-footer{margin:10px 10px 5px}#topbar-first a{color:white}#topbar-first .caret{border-top-color:#bebebe}#topbar-first .btn-group>a{background-color:#7f9baa}#topbar-first .btn-enter{background-color:#7f9baa;margin:6px 0}#topbar-first .btn-enter:hover{background-color:#89a2b0}#topbar-first .media-list a{color:#555;padding:0}#topbar-first .media-list li{color:#555}#topbar-first .media-list li i.accepted{color:#6fdbe8 !important}#topbar-first .media-list li i.declined{color:#ff8989 !important}#topbar-first .media-list li.placeholder{border-bottom:none}#topbar-first .media-list .media .media-body .label{padding:.1em .5em}#topbar-first .account .user-title{text-align:right}#topbar-first .account .user-title span{color:#d7d7d7}#topbar-first .dropdown.account>a,#topbar-first .dropdown.account.open>a,#topbar-first .dropdown.account>a:hover,#topbar-first .dropdown.account.open>a:hover{background-color:#708fa0}#topbar-second{top:50px;background-color:#fff;z-index:1029;background-image:none;-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1);border-bottom:1px solid #d4d4d4}#topbar-second .dropdown-menu{padding-top:0;padding-bottom:0}#topbar-second .dropdown-menu .divider{margin:0}#topbar-second #space-menu-dropdown,#topbar-second #search-menu-dropdown{width:400px}#topbar-second #space-menu-dropdown .media-list,#topbar-second #search-menu-dropdown .media-list{max-height:400px;overflow:auto}@media screen and (max-width:768px){#topbar-second #space-menu-dropdown .media-list,#topbar-second #search-menu-dropdown .media-list{max-height:200px}}#topbar-second #space-menu-dropdown form,#topbar-second #search-menu-dropdown form{margin:10px}#topbar-second #space-menu-dropdown .search-reset,#topbar-second #search-menu-dropdown .search-reset{position:absolute;color:#BFBFBF;margin:7px;top:0px;right:40px;z-index:10;display:none;cursor:pointer}#topbar-second .nav>li>a{padding:7px 13px 0;text-decoration:none;text-shadow:none;font-weight:600;font-size:10px;min-height:50px;text-transform:uppercase;text-align:center}#topbar-second .nav>li>a:hover,#topbar-second .nav>li>a:active,#topbar-second .nav>li>a:focus{border-bottom:3px solid #6fdbe8;background-color:#f7f7f7;color:#555;text-decoration:none}#topbar-second .nav>li>a i{font-size:14px}#topbar-second .nav>li>a .caret{border-top-color:#7a7a7a}#topbar-second .nav>li.active>a{min-height:47px}#topbar-second .nav>li>ul>li>a{border-left:3px solid #fff;background-color:#fff;color:#555}#topbar-second .nav>li>ul>li>a:hover,#topbar-second .nav>li>ul>li>a.active{border-left:3px solid #6fdbe8;background-color:#f7f7f7;color:#555}#topbar-second .nav>li>a#space-menu{padding-right:13px;border-right:1px solid #ededed}#topbar-second .nav>li>a#search-menu{padding-top:15px}#topbar-second .nav>li>a:hover,#topbar-second .nav .open>a,#topbar-second .nav>li.active{border-bottom:3px solid #6fdbe8;background-color:#f7f7f7;color:#555}#topbar-second .nav>li.active>a:hover{border-bottom:none}#topbar-second #space-menu-dropdown li>ul>li>a>.media .media-body p{color:#bebebe;font-size:11px;margin:0;font-weight:400}@media (max-width:767px){.topbar{padding-left:0;padding-right:0}}.login-container{background-color:#708fa0;background-image:linear-gradient(to right, #708fa0 0%, #8fa7b4 50%, #8fa7b4 100%),linear-gradient(to right, #7f9baa 0%, #bdcbd3 51%, #adbfc9 100%);background-size:100% 100%;position:relative;padding-top:40px}.login-container .text{color:#fff;font-size:12px;margin-bottom:15px}.login-container .text a{color:#fff;text-decoration:underline}.login-container .panel a{color:#6fdbe8}.login-container h1,.login-container h2{color:#fff !important}.login-container .panel{box-shadow:0 0 15px #627d92;-moz-box-shadow:0 0 15px #627d92;-webkit-box-shadow:0 0 15px #627d92}.login-container .panel .panel-heading,.login-container .panel .panel-body{padding:15px}.login-container select{color:#555}#account-login-form .form-group{margin-bottom:10px}.dropdown-menu li a{font-size:13px !important;font-weight:600 !important}.dropdown-menu li a i{margin-right:5px;font-size:14px;display:inline-block;width:14px}.dropdown-menu li a:hover,.dropdown-menu li a:visited,.dropdown-menu li a:hover,.dropdown-menu li a:focus{background:none;cursor:pointer}.dropdown-menu li:hover,.dropdown-menu li.selected{color:#555}.dropdown-menu li:first-child{margin-top:3px}.dropdown-menu li:last-child{margin-bottom:3px}.modal .dropdown-menu,.panel .dropdown-menu,.nav-tabs .dropdown-menu{border:1px solid #d7d7d7}.modal .dropdown-menu li.divider,.panel .dropdown-menu li.divider,.nav-tabs .dropdown-menu li.divider{background-color:#f7f7f7;border-bottom:none;margin:9px 1px !important}.modal .dropdown-menu li,.panel .dropdown-menu li,.nav-tabs .dropdown-menu li{border-left:3px solid white}.modal .dropdown-menu li a,.panel .dropdown-menu li a,.nav-tabs .dropdown-menu li a{color:#555;font-size:14px;font-weight:400;padding:4px 15px}.modal .dropdown-menu li a i,.panel .dropdown-menu li a i,.nav-tabs .dropdown-menu li a i{margin-right:5px}.modal .dropdown-menu li a:hover,.panel .dropdown-menu li a:hover,.nav-tabs .dropdown-menu li a:hover{background:none}.modal .dropdown-menu li:hover,.panel .dropdown-menu li:hover,.nav-tabs .dropdown-menu li:hover,.modal .dropdown-menu li.selected,.panel .dropdown-menu li.selected,.nav-tabs .dropdown-menu li.selected{border-left:3px solid #6fdbe8;background-color:#f7f7f7 !important}ul.contextMenu{border:1px solid #d7d7d7}ul.contextMenu li.divider{background-color:#f7f7f7;border-bottom:none;margin:9px 1px !important}ul.contextMenu li{border-left:3px solid white}ul.contextMenu li a{color:#555;font-size:14px;font-weight:400;padding:4px 15px}ul.contextMenu li a i{margin-right:5px}ul.contextMenu li a:hover{background:none}ul.contextMenu li:hover,ul.contextMenu li.selected{border-left:3px solid #6fdbe8;background-color:#f7f7f7 !important}.media-list li{padding:10px;border-bottom:1px solid #eee;position:relative;border-left:3px solid white;font-size:12px}.media-list li a{color:#555}.media-list .badge-space-type{background-color:#f7f7f7;border:1px solid #d7d7d7;color:#b2b2b2;padding:3px 3px 2px 3px}.media-list li.new{border-left:3px solid #f3fcfd;background-color:#f3fcfd}.media-list li:hover,.media-list li.selected{background-color:#f7f7f7;border-left:3px solid #6fdbe8}.media-list li.placeholder{font-size:14px !important;border-bottom:none}.media-list li.placeholder:hover{background:none !important;border-left:3px solid white}.media-left,.media>.pull-left{padding-right:0;margin-right:10px}.media:after{content:'';clear:both;display:block}.media .time{font-size:11px;color:#bebebe}.media .img-space{position:absolute;top:35px;left:35px}.media .media-body{font-size:13px}.media .media-body h4.media-heading{font-size:14px;font-weight:500;color:#555}.media .media-body h4.media-heading a{color:#555}.media .media-body h4.media-heading small,.media .media-body h4.media-heading small a{font-size:11px;color:#bebebe}.media .media-body h4.media-heading .content{margin-right:35px}.media .media-body .content a{word-break:break-all}.media .media-body h5{color:#aeaeae;font-weight:300;margin-top:5px;margin-bottom:5px;min-height:15px}.media .media-body .module-controls{font-size:85%}.media .media-body .module-controls a{color:#6fdbe8}.media .content a{color:#6fdbe8}.media .content .files a{color:#555}.content span{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.panel{border:none;background-color:#fff;box-shadow:0 0 3px #dadada;-webkit-box-shadow:0 0 3px #dadada;-moz-box-shadow:0 0 3px #dadada;border-radius:4px;position:relative;margin-bottom:15px}.panel h1{font-size:16px;font-weight:300;margin-top:0;color:#555}.panel .panel-heading{font-size:16px;font-weight:300;color:#555;background-color:white;border:none;padding:10px;border-radius:4px}.panel .panel-heading .heading-link{color:#6fdbe8 !important;font-size:.8em}.panel .panel-body{padding:10px;font-size:13px}.panel .panel-body p{color:#555}.panel .statistics .entry{margin-left:20px;font-size:12px}.panel .statistics .entry .count{color:#6fdbe8;font-weight:600;font-size:20px;line-height:.8em}.panel h3.media-heading small{font-size:75%}.panel h3.media-heading small a{color:#6fdbe8}.panel-danger{border:2px solid #ff8989}.panel-danger .panel-heading{color:#ff8989}.panel-success{border:2px solid #97d271}.panel-success .panel-heading{color:#97d271}.panel-warning{border:2px solid #fdd198}.panel-warning .panel-heading{color:#fdd198}.panel.profile{position:relative}.panel.profile .controls{position:absolute;top:10px;right:10px}.panel.members .panel-body a img,.panel.groups .panel-body a img,.panel.follower .panel-body a img,.panel.spaces .panel-body a img{margin-bottom:5px}.panel-profile .panel-profile-header{position:relative;border:3px solid #fff;border-top-right-radius:3px;border-top-left-radius:3px}.panel-profile .panel-profile-header .img-profile-header-background{border-radius:3px;min-height:110px}.panel-profile .panel-profile-header .img-profile-data{position:absolute;height:100px;width:100%;bottom:0;left:0;padding-left:180px;padding-top:30px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:#fff;pointer-events:none;background:-moz-linear-gradient(top, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 1%, rgba(0,0,0,0.38) 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(0,0,0,0)), color-stop(1%, rgba(0,0,0,0)), color-stop(100%, rgba(0,0,0,0.38)));background:-webkit-linear-gradient(top, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 1%, rgba(0,0,0,0.38) 100%);background:-o-linear-gradient(top, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 1%, rgba(0,0,0,0.38) 100%);background:-ms-linear-gradient(top, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 1%, rgba(0,0,0,0.38) 100%);background:linear-gradient(to bottom, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 1%, rgba(0,0,0,0.38) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#94000000', GradientType=0)}.panel-profile .panel-profile-header .img-profile-data h1{font-size:30px;font-weight:100;margin-bottom:7px;color:#fff;max-width:600px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.panel-profile .panel-profile-header .img-profile-data h2{font-size:16px;font-weight:400;margin-top:0}.panel-profile .panel-profile-header .img-profile-data h1.space{font-size:30px;font-weight:700}.panel-profile .panel-profile-header .img-profile-data h2.space{font-size:13px;font-weight:300;max-width:600px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.panel-profile .panel-profile-header .profile-user-photo-container{position:absolute;bottom:-50px;left:15px}.panel-profile .panel-profile-header .profile-user-photo-container .profile-user-photo{border:3px solid #fff;border-radius:5px}.panel-profile .panel-profile-controls{padding-left:160px}.panel.pulse,.panel.fadeIn{-webkit-animation-duration:200ms;-moz-animation-duration:200ms;animation-duration:200ms}@media (max-width:767px){.panel-profile-controls{padding-left:0 !important;padding-top:50px}.panel-profile .panel-profile-header .img-profile-data h1{font-size:20px !important}}.panel-body>.tab-menu{margin-left:-10px;margin-right:-10px}.installer .logo{text-align:center}.installer h2{font-weight:100}.installer .panel{margin-top:50px}.installer .panel h3{margin-top:0}.installer .powered,.installer .powered a{color:#bac2c7 !important;margin-top:10px;font-size:12px}.installer .fa{width:18px}.installer .check-ok{color:#97d271}.installer .check-warning{color:#fdd198}.installer .check-error{color:#ff8989}.installer .prerequisites-list ul{list-style:none;padding-left:15px}.installer .prerequisites-list ul li{padding-bottom:5px}.pagination-container{text-align:center}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{background-color:#708fa0;border-color:#708fa0}.pagination>li>a,.pagination>li>span,.pagination>li>a:hover,.pagination>li>a:active,.pagination>li>a:focus{color:#555;cursor:pointer}.well-small{padding:10px;border-radius:3px}.well{border:none;box-shadow:none;background-color:#ededed;margin-bottom:1px}.well hr{margin:15px 0 10px;border-top:1px solid #d9d9d9}.well table>thead{font-size:11px}.tab-sub-menu{padding-left:10px}.tab-sub-menu li>a:hover,.tab-sub-menu li>a:focus{background-color:#f7f7f7;border-bottom-color:#ddd}.tab-sub-menu li.active>a{background-color:#fff;border-bottom-color:transparent}.tab-menu{padding-top:10px;background-color:#fff}.tab-menu .nav-tabs{padding-left:10px}.tab-menu .nav-tabs li>a{padding-top:12px;border-color:#ddd;border-bottom:1px solid #ddd;background-color:#f7f7f7;max-height:41px;outline:none}.tab-menu .nav-tabs li>a:hover,.tab-menu .nav-tabs li>a:focus{padding-top:10px;border-top:3px solid #ddd}.tab-menu .nav-tabs li>a:hover{background-color:#f7f7f7}.tab-menu .nav-tabs li.active>a,.tab-menu .nav-tabs li.active>a:hover{padding-top:10px;border-top:3px solid #6fdbe8}.tab-menu .nav-tabs li.active>a{background-color:#fff;border-bottom-color:transparent}ul.tab-menu{padding-top:10px;background-color:#fff;padding-left:10px}ul.tab-menu-settings li>a{padding-top:12px;border-color:#ddd;border-bottom:1px solid #ddd;background-color:#f7f7f7;max-height:41px;outline:none}ul.tab-menu-settings li>a:hover,ul.tab-menu-settings li>a:focus{padding-top:10px;border-top:3px solid #ddd !important}ul.tab-menu-settings li>a:hover{background-color:#f7f7f7}ul.tab-menu-settings li.active>a,ul.tab-menu-settings li.active>a:hover,ul.tab-menu-settings li.active>a:focus{padding-top:10px;border-top:3px solid #6fdbe8 !important}ul.tab-menu-settings li.active>a{background-color:#fff;border-bottom-color:transparent !important}.nav-pills .dropdown-menu,.nav-tabs .dropdown-menu,.account .dropdown-menu{background-color:#708fa0;border:none}.nav-pills .dropdown-menu li.divider,.nav-tabs .dropdown-menu li.divider,.account .dropdown-menu li.divider{background-color:#628394;border-bottom:none;margin:9px 1px !important}.nav-pills .dropdown-menu li,.nav-tabs .dropdown-menu li,.account .dropdown-menu li{border-left:3px solid #708fa0}.nav-pills .dropdown-menu li a,.nav-tabs .dropdown-menu li a,.account .dropdown-menu li a{color:white;font-weight:400;font-size:13px;padding:4px 15px}.nav-pills .dropdown-menu li a i,.nav-tabs .dropdown-menu li a i,.account .dropdown-menu li a i{margin-right:5px;font-size:14px;display:inline-block;width:14px}.nav-pills .dropdown-menu li a:hover,.nav-tabs .dropdown-menu li a:hover,.account .dropdown-menu li a:hover,.nav-pills .dropdown-menu li a:visited,.nav-tabs .dropdown-menu li a:visited,.account .dropdown-menu li a:visited,.nav-pills .dropdown-menu li a:hover,.nav-tabs .dropdown-menu li a:hover,.account .dropdown-menu li a:hover,.nav-pills .dropdown-menu li a:focus,.nav-tabs .dropdown-menu li a:focus,.account .dropdown-menu li a:focus{background:none}.nav-pills .dropdown-menu li:hover,.nav-tabs .dropdown-menu li:hover,.account .dropdown-menu li:hover,.nav-pills .dropdown-menu li.selected,.nav-tabs .dropdown-menu li.selected,.account .dropdown-menu li.selected{border-left:3px solid #6fdbe8;color:#fff !important;background-color:#628394 !important}.nav-pills.preferences .dropdown .dropdown-toggle{color:#bebebe}.nav-pills.preferences .dropdown.open .dropdown-toggle,.nav-pills.preferences .dropdown.open .dropdown-toggle:hover{background-color:#708fa0}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{background-color:#708fa0}.nav-tabs{margin-bottom:10px}.list-group a [class^="fa-"],.list-group a [class*=" fa-"]{display:inline-block;width:18px}.nav-pills.preferences{position:absolute;right:10px;top:10px}.nav-pills.preferences .dropdown .dropdown-toggle{padding:2px 10px}.nav-pills.preferences .dropdown.open .dropdown-toggle,.nav-pills.preferences .dropdown.open .dropdown-toggle:hover{color:white}.nav-tabs li{font-weight:600;font-size:12px}.tab-content .tab-pane a{color:#6fdbe8}.tab-content .tab-pane .form-group{margin-bottom:5px}.nav-tabs.tabs-center li{float:none;display:inline-block}.nav-tabs.tabs-small li>a{padding:5px 7px}.nav .caret,.nav .caret:hover,.nav .caret:active{border-top-color:#555;border-bottom-color:#555;height:6.928px}.nav li.dropdown>a:hover .caret,.nav li.dropdown>a:active .caret{border-top-color:#555;border-bottom-color:#555}.nav .open>a .caret,.nav .open>a:hover .caret,.nav .open>a:focus .caret{border-top-color:#555;border-bottom-color:#555}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:#ededed;color:#555}.nav .open>a .caret,.nav .open>a:hover .caret,.nav .open>a:focus .caret{color:#555}.footer-nav{filter:opacity(.6);font-size:12px;text-align:center}@media (max-width:991px){.controls-header{text-align:left !important}}.btn{float:none;border:none;-webkit-box-shadow:none;box-shadow:none;-moz-box-shadow:none;background-image:none;text-shadow:none;border-radius:3px;outline:none !important;margin-bottom:0;font-size:14px;font-weight:600;padding:8px 16px}.input.btn{outline:none}.btn-lg{padding:16px 28px}.btn-sm{padding:4px 8px;font-size:12px}.btn-sm i{font-size:14px}.btn-xs{padding:1px 5px;font-size:12px}.btn-default{background:#ededed;color:#7a7a7a !important}.btn-default:hover,.btn-default:focus{background:#e8e8e8;text-decoration:none;color:#7a7a7a}.btn-default:active,.btn-default.active{outline:0;background:#e0e0e0}.btn-default[disabled],.btn-default.disabled{background:#f2f2f2}.btn-default[disabled]:hover,.btn-default.disabled:hover,.btn-default[disabled]:focus,.btn-default.disabled:focus{background:#f2f2f2}.btn-default[disabled]:active,.btn-default.disabled:active,.btn-default[disabled].active,.btn-default.disabled.active{background:#f2f2f2}.btn-primary{background:#708fa0;color:#fff !important}.btn-primary:hover,.btn-primary:focus{background:#628394;text-decoration:none}.btn-primary:active,.btn-primary.active{outline:0;background:#628394 !important}.btn-primary[disabled],.btn-primary.disabled{background:#7f9baa}.btn-primary[disabled]:hover,.btn-primary.disabled:hover,.btn-primary[disabled]:focus,.btn-primary.disabled:focus{background:#7f9baa}.btn-primary[disabled]:active,.btn-primary.disabled:active,.btn-primary[disabled].active,.btn-primary.disabled.active{background:#7f9baa !important}.btn-info{background:#6fdbe8;color:#fff !important}.btn-info:hover,.btn-info:focus{background:#59d6e4 !important;text-decoration:none}.btn-info:active,.btn-info.active{outline:0;background:#59d6e4}.btn-info[disabled],.btn-info.disabled{background:#85e0ec}.btn-info[disabled]:hover,.btn-info.disabled:hover,.btn-info[disabled]:focus,.btn-info.disabled:focus{background:#85e0ec}.btn-info[disabled]:active,.btn-info.disabled:active,.btn-info[disabled].active,.btn-info.disabled.active{background:#85e0ec !important}.btn-danger{background:#ff8989;color:#fff !important}.btn-danger:hover,.btn-danger:focus{background:#ff6f6f;text-decoration:none}.btn-danger:active,.btn-danger.active{outline:0;background:#ff6f6f !important}.btn-danger[disabled],.btn-danger.disabled{background:#ffa3a3}.btn-danger[disabled]:hover,.btn-danger.disabled:hover,.btn-danger[disabled]:focus,.btn-danger.disabled:focus{background:#ffa3a3}.btn-danger[disabled]:active,.btn-danger.disabled:active,.btn-danger[disabled].active,.btn-danger.disabled.active{background:#ffa3a3 !important}.btn-success{background:#97d271;color:#fff !important}.btn-success:hover,.btn-success:focus{background:#89cc5e;text-decoration:none}.btn-success:active,.btn-success.active{outline:0;background:#89cc5e !important}.btn-success[disabled],.btn-success.disabled{background:#a5d884}.btn-success[disabled]:hover,.btn-success.disabled:hover,.btn-success[disabled]:focus,.btn-success.disabled:focus{background:#a5d884}.btn-success[disabled]:active,.btn-success.disabled:active,.btn-success[disabled].active,.btn-success.disabled.active{background:#a5d884 !important}.btn-warning{background:#fdd198;color:#fff !important}.btn-warning:hover,.btn-warning:focus{background:#fdcd8e;text-decoration:none}.btn-warning:active,.btn-warning.active{outline:0;background:#fdcd8e !important}.btn-warning[disabled],.btn-warning.disabled{background:#fddcb1}.btn-warning[disabled]:hover,.btn-warning.disabled:hover,.btn-warning[disabled]:focus,.btn-warning.disabled:focus{background:#fddcb1}.btn-warning[disabled]:active,.btn-warning.disabled:active,.btn-warning[disabled].active,.btn-warning.disabled.active{background:#fddcb1 !important}.radio,.checkbox{margin-top:5px !important;margin-bottom:0}.radio label,.checkbox label{padding-left:10px}.form-control{border:2px solid #ededed;box-shadow:none;min-height:35px}.form-control:focus{border:2px solid #6fdbe8;outline:0;box-shadow:none}.form-control.form-search{border-radius:30px;background-image:url("../img/icon_search16x16.png");background-repeat:no-repeat;background-position:10px 8px;padding-left:34px}.form-group-search{position:relative}.form-group-search .form-button-search{position:absolute;top:4px;right:4px;border-radius:30px}textarea{resize:none;height:1.5em}select.form-control:not([multiple]){-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("../img/select_arrow.png") !important;background-repeat:no-repeat;background-position:right 13px;overflow:hidden}label{font-weight:normal}label.control-label{font-weight:bold}::-webkit-input-placeholder{color:#bebebe !important}::-moz-placeholder{color:#bebebe !important}:-ms-input-placeholder{color:#bebebe !important}input:-moz-placeholder{color:#bebebe !important}.placeholder{padding:10px}input.placeholder,textarea.placeholder{padding:0 0 0 10px;color:#999}.help-block-error{font-size:12px}.hint-block,.help-block:not(.help-block-error){color:#aeaeae !important;font-size:12px}.hint-block:hover,.help-block:not(.help-block-error):hover{color:#7a7a7a !important;font-size:12px}.input-group-addon{border:none}a.input-field-addon{font-size:12px;float:right;margin-top:-10px}a.input-field-addon-sm{font-size:11px;float:right;margin-top:-10px}.timeZoneInputContainer{padding-top:10px}.timeZoneInputContainer~.help-block{margin:0px}.label{text-transform:uppercase}.label{text-transform:uppercase;display:inline-block;padding:3px 5px 4px;font-weight:600;font-size:10px !important;color:white !important;vertical-align:baseline;white-space:nowrap;text-shadow:none}.label-default{background:#ededed;color:#7a7a7a !important}a.label-default:hover{background:#e0e0e0 !important}.label-info{background-color:#6fdbe8}a.label-info:hover{background:#59d6e4 !important}.label-danger{background-color:#ff8989}a.label-danger:hover{background:#ff6f6f !important}.label-success{background-color:#97d271}a.label-success:hover{background:#89cc5e !important}.label-warning{background-color:#fdd198}a.label-warning:hover{background:#fdc67f !important}.regular-checkbox:checked+.regular-checkbox-box{border:2px solid #6fdbe8;background:#6fdbe8;color:white}.regular-checkbox-box.disabled{background:#d7d7d7 !important;border:2px solid #d7d7d7 !important;cursor:not-allowed}.regular-radio:checked+.regular-radio-button:after{background:#6fdbe8}.regular-radio:checked+.regular-radio-button{background-color:none;color:#99a1a7;border:2px solid #d7d7d7;margin-right:5px}.regular-radio.disabled{background:#d7d7d7 !important;border:2px solid #d7d7d7 !important;cursor:not-allowed}.errorMessage{color:#ff8989;padding:10px 0}.error{border-color:#ff8989 !important}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#ff8989 !important}.has-error .form-control,.has-error .form-control:focus{border-color:#ff8989;-webkit-box-shadow:none;box-shadow:none}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#97d271}.has-success .form-control,.has-success .form-control:focus{border-color:#97d271;-webkit-box-shadow:none;box-shadow:none}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#fdd198}.has-warning .form-control,.has-warning .form-control:focus{border-color:#fdd198;-webkit-box-shadow:none;box-shadow:none}.bootstrap-timepicker-widget .form-control{padding:0px}#notification_overview_filter label{display:block}#notification_overview_list .img-space{position:absolute;top:25px;left:25px}@media (max-width:767px){.notifications{position:inherit !important;float:left !important}.notifications .dropdown-menu{width:300px !important;margin-left:0 !important}.notifications .dropdown-menu .arrow{margin-left:-142px !important}}.badge-space{margin-top:6px}.badge-space-chooser{padding:3px 5px;margin-left:1px}.badge{padding:3px 5px;border-radius:2px;font-weight:normal;font-family:Arial,sans-serif;font-size:10px !important;text-transform:uppercase;color:#fff;vertical-align:baseline;white-space:nowrap;text-shadow:none;background-color:#d7d7d7;line-height:1}.popover{border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);-moz-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175)}.popover .popover-title{background:none;border-bottom:none;color:#555;font-weight:300;font-size:16px;padding:15px}.popover .popover-content{font-size:13px;padding:5px 15px;color:#555}.popover .popover-content a{color:#6fdbe8}.popover .popover-content img{max-width:100%}.popover .popover-navigation{padding:15px}.list-group-item{padding:6px 15px;border:none;border-width:0 !important;border-left:3px solid #fff !important;font-size:12px;font-weight:600}.list-group-item i{font-size:14px}a.list-group-item:hover,a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#555;background-color:#f7f7f7;border-left:3px solid #6fdbe8 !important}@media (max-width:991px){.list-group{margin-left:4px}.list-group-item{display:inline-block !important;border-radius:3px !important;margin:4px 0;margin-bottom:4px !important}.list-group-item{border:none !important}a.list-group-item:hover,a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{border:none !important;background:#708fa0 !important;color:#fff !important}}@media screen and (max-width:768px){.modal-dialog{width:auto !important;padding-top:30px;padding-bottom:30px}}.modal-top{z-index:999999 !important}.modal{overflow-y:visible}.modal.in{padding-right:0 !important}.modal-dialog-extra-small{width:400px}.modal-dialog-small{width:500px}.modal-dialog-normal{width:600px}.modal-dialog-medium{width:768px}.modal-dialog-large{width:900px}@media screen and (max-width:920px){.modal-dialog-large{width:auto !important;padding-top:30px;padding-bottom:30px}}.modal{border:none}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5{margin-top:20px;color:#555;font-weight:300}.modal h4.media-heading{margin-top:0}.modal-title{font-size:20px;font-weight:200;color:#555}.modal-dialog,.modal-content{min-width:150px}.modal-content{-webkit-border-radius:3px;-moz-border-radius:3px;box-shadow:0 2px 26px rgba(0,0,0,0.3),0 0 0 1px rgba(0,0,0,0.1);-webkit-box-shadow:0 2px 26px rgba(0,0,0,0.3),0 0 0 1px rgba(0,0,0,0.1);-moz-box-shadow:0 2px 26px rgba(0,0,0,0.3),0 0 0 1px rgba(0,0,0,0.1);border:none}.modal-content .modal-header{padding:20px 20px 0;border-bottom:none;text-align:center}.modal-content .modal-header .close{margin-top:2px;margin-right:5px}.modal-content .modal-body{padding:20px;font-size:13px}.modal-content .modal-footer{margin-top:0;text-align:left;padding:10px 20px 30px;border-top:none;text-align:center}.modal-content .modal-footer hr{margin-top:0}.modal-backdrop{background-color:rgba(0,0,0,0.5)}.modal-dialog.fadeIn,.modal-dialog.pulse{-webkit-animation-duration:200ms;-moz-animation-duration:200ms;animation-duration:200ms}.module-installed{opacity:.5}.module-installed .label-success{background-color:#d7d7d7}.tooltip-inner{background-color:#708fa0;max-width:400px;text-align:left;font-weight:300;padding:2px 8px 4px;font-weight:bold;white-space:pre-wrap}.tooltip.top .tooltip-arrow{border-top-color:#708fa0}.tooltip.top-left .tooltip-arrow{border-top-color:#708fa0}.tooltip.top-right .tooltip-arrow{border-top-color:#708fa0}.tooltip.right .tooltip-arrow{border-right-color:#708fa0}.tooltip.left .tooltip-arrow{border-left-color:#708fa0}.tooltip.bottom .tooltip-arrow{border-bottom-color:#708fa0}.tooltip.bottom-left .tooltip-arrow{border-bottom-color:#708fa0}.tooltip.bottom-right .tooltip-arrow{border-bottom-color:#708fa0}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.progress{height:10px;margin-bottom:15px;box-shadow:none;background:#ededed;border-radius:10px}.progress-bar-info{background-color:#6fdbe8;-webkit-box-shadow:none;box-shadow:none}#nprogress .bar{height:2px;background:#6fdbe8}table{margin-bottom:0px !important}table th{font-size:11px;color:#bebebe;font-weight:normal}table thead tr th{border:none !important}table .time{font-size:12px}table td a:hover{color:#6fdbe8}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:10px 10px 10px 0}.table>thead>tr>th select,.table>tbody>tr>th select,.table>tfoot>tr>th select,.table>thead>tr>td select,.table>tbody>tr>td select,.table>tfoot>tr>td select{font-size:12px;padding:4px 8px;height:30px;margin:0}.table-middle>thead>tr>th,.table-middle>tbody>tr>th,.table-middle>tfoot>tr>th,.table-middle>thead>tr>td,.table-middle>tbody>tr>td,.table-middle>tfoot>tr>td{vertical-align:middle !important}.comment-container{margin-top:10px}.comment-container .wall-entry-controls{margin-left:50px}.comment .media{position:relative !important;margin-top:0}.comment .media .nav-pills.preferences{display:none;right:-3px;top:-3px}.comment .media-body{overflow:visible}.comment .jp-progress{background-color:#dbdcdd !important}.comment .jp-play-bar{background:#cacaca}.comment .content a{color:#21bdd0}.comment.guest-mode .media:last-child .wall-entry-controls{margin-bottom:0;margin-left:50px}.comment.guest-mode .media:last-child hr{display:none}.comment_create,.content_edit{position:relative}.comment_create .comment-buttons,.content_edit .comment-buttons{position:absolute;bottom:2px;right:5px;z-index:300}.comment_create .btn-comment-submit,.content_edit .btn-comment-submit{margin-top:3px}.comment_create .fileinput-button,.content_edit .fileinput-button{float:left;padding:6px 10px;background:transparent !important}.comment_create .fileinput-button .fa,.content_edit .fileinput-button .fa{color:#d7d7d7}.comment_create .fileinput-button:hover .fa,.content_edit .fileinput-button:hover .fa{background:transparent !important;color:#b2b2b2}.comment_create .fileinput-button:active,.content_edit .fileinput-button:active{box-shadow:none !important}.post-richtext-input-group{position:relative}.post-richtext-input-group .comment-buttons{bottom:7px !important}.comment-container .content_edit{margin-left:50px}.comment_edit_content{margin-left:50px}.comment-message{overflow:hidden;overflow-wrap:break-word}.comment-create-input-group{position:relative}.comment-create-input-group .ProsemirrorEditor .ProseMirror{padding-right:72px}.comment-create-input-group.scrollActive .comment-buttons{right:22px}.grid-view img{width:24px;height:24px}.grid-view .filters input,.grid-view .filters select{border:2px solid #ededed;box-shadow:none;min-height:35px;border-radius:4px;font-size:12px;padding:4px}.grid-view .filters input:focus,.grid-view .filters select:focus{border:2px solid #6fdbe8;outline:0;box-shadow:none}.grid-view{padding:15px 0 0}.grid-view img{border-radius:3px}.grid-view table th{font-size:13px !important;font-weight:bold !important}.grid-view table td{vertical-align:middle !important}.grid-view table tr{font-size:13px !important}.grid-view table thead tr th:first-of-type{padding-left:5px}.grid-view table tbody tr{height:50px}.grid-view table tbody tr td:first-of-type{padding-left:5px}.grid-view .summary{font-size:12px;color:#bac2c7}.permission-grid-editor>.table>tbody>tr:first-child>td{border:none}.permission-grid-editor{padding-top:0px}.detail-view td,.detail-view th{padding:8px !important}.detail-view th{font-size:13px}.oembed_snippet{margin-top:10px;position:relative;padding-bottom:55%;padding-top:15px;height:0;overflow:hidden}.oembed_snippet iframe{position:absolute;top:0;left:0;width:100%;height:100%}.activities{max-height:400px;overflow:auto}.activities li .media{position:relative}.activities li .media .img-space{position:absolute;top:14px;left:14px}.activities li .media .media-body{max-width:295px}.contentForm_options{margin-top:10px;min-height:29px}.contentForm_options .btn_container{position:relative}.contentForm_options .btn_container .label-public{position:absolute;right:40px;top:11px}#content-topic-bar{margin-top:5px;text-align:right}#content-topic-bar .label{margin-left:4px}#contentFormError{color:#ff8989;padding-left:0;list-style:none}.placeholder-empty-stream{background-image:url("../img/placeholder-postform-arrow.png");background-repeat:no-repeat;padding:37px 0 0 70px;margin-left:90px}.wall-entry{position:relative}.wall-entry .content p,.wall-entry .content a{overflow:hidden;text-overflow:ellipsis;max-width:100%}.wall-entry .content img{max-width:100%}.wall-entry .media{overflow:visible}.wall-entry .well{margin-bottom:0}.wall-entry .well .comment .show-all-link{font-size:12px;cursor:pointer}.wall-entry .media-heading{font-size:14px;padding-top:1px;margin-bottom:3px}.wall-entry .media-heading .labels{padding-right:32px}.wall-entry .media-heading .viaLink{font-size:13px}.wall-entry .media-heading .viaLink i{color:#bebebe;padding-left:4px;padding-right:4px}.wall-entry .media-subheading{color:#bebebe;font-size:12px}.wall-entry .media-subheading .time{font-size:12px;white-space:nowrap}.wall-entry-controls,.wall-entry-controls a{font-size:11px;font-weight:700;color:#7a7a7a;margin-top:10px;margin-bottom:0}#wall-stream-filter-nav{font-size:12px;margin-bottom:10px;padding-top:2px;border-radius:0 0 4px 4px}#wall-stream-filter-nav .wall-stream-filter-root{margin:0;border:0 !important}#wall-stream-filter-nav .filter-panel{padding:0 10px}#wall-stream-filter-nav .wall-stream-filter-head{padding:5px 5px 10px 5px;border-bottom:1px solid #ddd}#wall-stream-filter-nav .wall-stream-filter-body{overflow:hidden;background-color:#f7f7f7;border:1px solid #ddd;border-top:0;border-radius:0 0 4px 4px}#wall-stream-filter-nav hr{margin:5px 0 0 0}#wall-stream-filter-nav .topic-remove-label{float:left}#wall-stream-filter-nav .topic-remove-label,#wall-stream-filter-nav .content-type-remove-label{margin-right:6px}#wall-stream-filter-nav .select2{width:260px !important;margin-bottom:5px;margin-top:2px}#wall-stream-filter-nav .select2 .select2-search__field{height:25px !important}#wall-stream-filter-nav .select2 .select2-selection__choice{height:23px !important}#wall-stream-filter-nav .select2 .select2-selection__choice span,#wall-stream-filter-nav .select2 .select2-selection__choice i{line-height:19px !important}#wall-stream-filter-nav .select2 .select2-selection__choice .img-rounded{width:18px !important;height:18px !important}#wall-stream-filter-nav .wall-stream-filter-bar{display:inline;float:right;white-space:normal}#wall-stream-filter-nav .wall-stream-filter-bar .label{height:18px;padding-top:4px}#wall-stream-filter-nav .wall-stream-filter-bar .btn,#wall-stream-filter-nav .wall-stream-filter-bar .label{box-shadow:0 0 2px #7a7a7a;-webkit-box-shadow:0 0 2px #7a7a7a;-moz-box-shadow:0 0 2px #7a7a7a}@media (max-width:767px){#wall-stream-filter-nav .wall-stream-filter-root{white-space:nowrap}#wall-stream-filter-nav .wall-stream-filter-body{overflow:auto}}.filter-root{margin:15px}.filter-root .row{display:table !important}.filter-root .filter-panel{padding:0 5px;display:table-cell !important;float:none}.filter-root .filter-panel .filter-block strong{margin-bottom:5px}.filter-root .filter-panel .filter-block ul.filter-list{list-style:none;padding:0;margin:0 0 5px}.filter-root .filter-panel .filter-block ul.filter-list li{font-size:12px;padding:2px}.filter-root .filter-panel .filter-block ul.filter-list li a{color:#555}.filter-root .filter-panel div.filter-block:last-of-type ul.filter-list{margin:0px}.filter-root .filter-panel+.filter-panel{border-left:2px solid #ededed}.stream-entry-loader{float:right;margin-top:5px}.load-suppressed{margin-top:-17px;margin-bottom:15px;text-align:center}.load-suppressed a{display:inline-block;background-color:white;padding:5px;border-radius:0 0 4px 4px;border:1px solid #ddd;font-size:11px}.space-owner{text-align:center;margin:14px 0;font-size:13px;color:#999}.space-member-sign{color:#97d271;position:absolute;top:42px;left:42px;font-size:16px;background:#fff;width:24px;height:24px;padding:2px 3px 1px 4px;border-radius:50px;border:2px solid #97d271}#space-menu-dropdown i.type{font-size:16px;color:#BFBFBF}#space-menu-spaces [data-space-chooser-item]{cursor:pointer}#space-menu-dropdown .input-group-addon{border-radius:0px 4px 4px 0px}#space-menu-dropdown .input-group-addon.focus{border-radius:0px 4px 4px 0px;border:2px solid #6fdbe8;border-left:0px}#space-menu-search{border-right:0px}#space-directory-link i{margin-right:0px}.space-acronym{color:#fff;text-align:center;display:inline-block}.current-space-image{margin-right:3px;margin-top:3px}@media (max-width:767px){#space-menu>.title{display:none}#space-menu-dropdown{width:300px !important}}.files,#postFormFiles_list{padding-left:0}.contentForm-upload-list{padding-left:0}.contentForm-upload-list li:first-child{margin-top:10px}.file_upload_remove_link,.file_upload_remove_link:hover{color:#ff8989;cursor:pointer}.file-preview-item{text-overflow:ellipsis;overflow:hidden}.post-files{margin-top:10px}.post-files img{vertical-align:top;margin-bottom:3px;margin-right:5px;max-height:100%;-webkit-animation-duration:2s;animation-duration:2s}#wallStream.mobile .post-files{margin-top:10px;display:flex;overflow-x:auto}#wallStream.mobile .post-files img{max-width:190px}.file-preview-content{cursor:pointer}.image-upload-container{position:relative}.image-upload-container .image-upload-buttons{display:none;position:absolute;right:5px;bottom:5px}.image-upload-container input[type="file"]{position:absolute;opacity:0}.image-upload-container .image-upload-loader{display:none;position:absolute;top:0;left:0;width:100%;height:100%;padding:20px;background:#f8f8f8}.mime{background-repeat:no-repeat;background-position:0 0;padding:1px 0 4px 26px}.mime-word{background-image:url("../img/mime/word.png")}.mime-excel{background-image:url("../img/mime/excel.png")}.mime-powerpoint{background-image:url("../img/mime/powerpoint.png")}.mime-pdf{background-image:url("../img/mime/pdf.png")}.mime-zip{background-image:url("../img/mime/zip.png")}.mime-image{background-image:url("../img/mime/image.png")}.mime-file{background-image:url("../img/mime/file.png")}.mime-photoshop{background-image:url("../img/mime/photoshop.png")}.mime-illustrator{background-image:url("../img/mime/illustrator.png")}.mime-video{background-image:url("../img/mime/video.png")}.mime-audio{background-image:url("../img/mime/audio.png")}ul.tour-list{list-style:none;margin-bottom:0;padding-left:10px}ul.tour-list li{padding-top:5px}ul.tour-list li a{color:#6fdbe8}ul.tour-list li a .fa{width:16px}ul.tour-list li.completed a{text-decoration:line-through;color:#bebebe}.atwho-view{position:absolute;top:0;left:0;display:none;margin-top:18px;background:white;color:#555555;font-size:14px;font-weight:400;border:1px solid #d7d7d7;border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);min-width:120px;max-width:265px;z-index:11110 !important;padding:5px 0}.atwho-view strong,.atwho-view b{font-weight:normal}.atwho-view ul li.hint{background:#fff !important;border-left:3px solid transparent !important;font-size:12px;color:#999}.atwho-view .cur small{color:red}.atwho-view strong{background-color:#f9f0d2}.atwho-view .cur strong{background-color:#f9f0d2}.atwho-view ul{list-style:none;padding:0;margin:auto}.atwho-view ul li{display:block;padding:5px 10px;border-left:3px solid transparent;padding:4px 15px 4px 8px;cursor:pointer}.atwho-view small{font-size:smaller;color:#777;font-weight:normal}.atwho-input.form-control{min-height:36px;height:auto;padding-right:95px;word-wrap:break-word}.atwho-input p{padding:0;margin:0}.atwho-placeholder{color:#bebebe !important}.atwho-emoji-entry{float:left;padding:4px !important;margin:0px !important;border:none !important}.atwho-emoji-entry:hover,.atwho-emoji-entry:active,.atwho-emoji-entry:focus{padding:4px !important;margin:0px !important;border:none !important;background-color:#f7f7f7 !important;border-radius:3px}.atwho-view .cur{border-left:3px solid #6fdbe8;background-color:#f7f7f7 !important}.atwho-user,.atwho-space,.atwho-input a{color:#6fdbe8}.atwho-input a:hover{color:#6fdbe8}.atwho-view strong{background-color:#f9f0d2}.atwho-view .cur strong{background-color:#f9f0d2}.atwho-view span{padding:5px}.sk-spinner-three-bounce.sk-spinner{margin:0 auto;width:70px;text-align:center}.loader{padding:30px 0}.loader .sk-spinner-three-bounce div,.loader .sk-spinner-three-bounce span{width:12px;height:12px;background-color:#6fdbe8;border-radius:100%;display:inline-block;-webkit-animation:sk-threeBounceDelay 1.4s infinite ease-in-out;animation:sk-threeBounceDelay 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.loader .sk-spinner-three-bounce .sk-bounce1{-webkit-animation-delay:-0.32s;animation-delay:-0.32s}.loader .sk-spinner-three-bounce .sk-bounce2{-webkit-animation-delay:-0.16s;animation-delay:-0.16s}@-webkit-keyframes sk-threeBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-threeBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.loader-modal{padding:8px 0}.loader-postform{padding:9px 0}.loader-postform .sk-spinner-three-bounce.sk-spinner{text-align:left;margin:0}.markdown-render h1,.markdown-render h2,.markdown-render h3,.markdown-render h4,.markdown-render h5,.markdown-render h6{font-weight:bold !important}.markdown-render h1{font-size:28px !important}.markdown-render h2{font-size:24px !important}.markdown-render h3{font-size:18px !important}.markdown-render h4{font-size:16px !important}.markdown-render h5{font-size:14px !important}.markdown-render h6{color:#999;font-size:14px !important}.markdown-render pre{padding:0;border:none;border-radius:3px}.markdown-render pre code{padding:10px;border-radius:3px;font-size:12px !important}.markdown-render a,.markdown-render a:visited{background-color:inherit;text-decoration:none;color:#6fdbe8 !important}.markdown-render a.header-anchor{color:#777 !important}.markdown-render img{max-width:100%}.markdown-render table{width:100%}.markdown-render table th{font-size:13px;font-weight:700;color:#555}.markdown-render table thead tr{border-bottom:1px solid #d7d7d7}.markdown-render table tbody tr td,.markdown-render table thead tr th{border:1px solid #d7d7d7 !important;padding:4px}.md-editor.active{border:2px solid #6fdbe8 !important}.md-editor textarea{padding:10px !important}[data-ui-markdown],[data-ui-richtext]{overflow:hidden;overflow-wrap:break-word}[data-ui-markdown] h1,[data-ui-richtext] h1,[data-ui-markdown] h2,[data-ui-richtext] h2,[data-ui-markdown] h3,[data-ui-richtext] h3,[data-ui-markdown] h4,[data-ui-richtext] h4,[data-ui-markdown] h5,[data-ui-richtext] h5,[data-ui-markdown] h6,[data-ui-richtext] h6{text-align:start;margin:0 0 .5em}[data-ui-markdown] h1,[data-ui-richtext] h1{font-size:1.7em !important;font-weight:600}[data-ui-markdown] h2,[data-ui-richtext] h2{font-size:1.5em !important;font-weight:500}[data-ui-markdown] h3,[data-ui-richtext] h3{font-size:1.2em !important}[data-ui-markdown] h4,[data-ui-richtext] h4{font-size:1.1em !important}[data-ui-markdown] h5,[data-ui-richtext] h5{font-size:1em !important}[data-ui-markdown] h6,[data-ui-richtext] h6{font-size:.85em !important}[data-ui-markdown] p,[data-ui-richtext] p,[data-ui-markdown] pre,[data-ui-richtext] pre,[data-ui-markdown] blockquote,[data-ui-richtext] blockquote{margin:0 0 1.1em}[data-ui-markdown] p:last-child,[data-ui-richtext] p:last-child{margin:0}[data-ui-markdown] pre code.hljs,[data-ui-richtext] pre code.hljs{background-color:#f5f5f5}[data-ui-markdown] blockquote,[data-ui-richtext] blockquote{border-left-width:10px;background-color:rgba(128,128,128,0.05);border-top-right-radius:5px;border-bottom-right-radius:5px;padding:15px 20px;font-size:1em;border-left:5px solid #888888}[data-ui-markdown] table,[data-ui-richtext] table{width:100%}[data-ui-markdown] table th,[data-ui-richtext] table th{font-size:13px;font-weight:700;color:#555;background-color:#f7f7f7}[data-ui-markdown] table td,[data-ui-richtext] table td,[data-ui-markdown] table th,[data-ui-richtext] table th{border:1px solid #d7d7d7 !important;padding:6px}[data-ui-markdown] dt,[data-ui-richtext] dt,[data-ui-markdown] dd,[data-ui-richtext] dd{margin-top:5px;margin-bottom:5px;line-height:1.45}[data-ui-markdown] dt,[data-ui-richtext] dt{font-weight:bold}[data-ui-markdown] dd,[data-ui-richtext] dd{margin-left:40px}[data-ui-markdown] pre,[data-ui-richtext] pre{text-align:start;border:0;padding:10px 20px;border-radius:5px}[data-ui-markdown] pre code,[data-ui-richtext] pre code{white-space:pre !important}[data-ui-markdown] blockquote ul:last-child,[data-ui-richtext] blockquote ul:last-child,[data-ui-markdown] blockquote ol:last-child,[data-ui-richtext] blockquote ol:last-child{margin-bottom:0px}[data-ui-markdown] ul,[data-ui-richtext] ul,[data-ui-markdown] ol,[data-ui-richtext] ol{margin-top:0;margin-bottom:10.5px}[data-ui-markdown] ul li p,[data-ui-richtext] ul li p,[data-ui-markdown] ol li p,[data-ui-richtext] ol li p{overflow:visible !important}[data-ui-markdown] .footnote,[data-ui-richtext] .footnote{vertical-align:top;position:relative;top:-0.5em;font-size:.8em}[data-ui-markdown] .emoji,[data-ui-richtext] .emoji{width:16px}[data-ui-markdown] a.not-found,[data-ui-richtext] a.not-found{color:#fdd198}[data-ui-markdown] li,[data-ui-richtext] li{border:0 !important;background-color:transparent !important;padding:0}[data-ui-markdown] img,[data-ui-richtext] img{max-width:100%}blockquote{border-left:2px dotted #888;padding-left:5px;background:#d0f0ff}.wmd-panel{min-width:500px}.wmd-button-bar{width:100%;background-color:Silver}.wmd-input{height:300px;width:100%;background-color:Gainsboro;border:1px solid DarkGray}.wmd-button-row{position:relative;margin-left:5px;margin-right:5px;margin-bottom:5px;margin-top:10px;padding:0px;height:20px}.wmd-spacer{width:1px;height:20px;margin-left:14px;position:absolute;background-color:Silver;display:inline-block;list-style:none}.wmd-button{width:20px;height:20px;padding-left:2px;padding-right:3px;position:absolute;display:inline-block;list-style:none;cursor:pointer}.wmd-button>span{background-image:url(../img/wmd-buttons.png);background-repeat:no-repeat;background-position:0px 0px;width:20px;height:20px;display:inline-block}.wmd-spacer1{left:50px}.wmd-spacer2{left:175px}.wmd-spacer3{left:300px}.wmd-prompt-background{background-color:Black}.wmd-prompt-dialog{border:1px solid #999999;background-color:#F5F5F5}.wmd-prompt-dialog>div{font-size:.8em;font-family:arial,helvetica,sans-serif}.wmd-prompt-dialog>form>input[type="text"]{border:1px solid #999999;color:black}.wmd-prompt-dialog>form>input[type="button"]{border:1px solid #888888;font-family:trebuchet MS,helvetica,sans-serif;font-size:.8em;font-weight:bold}@media (max-width:991px){.layout-sidebar-container{display:none}}.ui-widget-header{border:none !important;background:#fff !important;color:#7a7a7a !important;font-weight:300 !important}.ui-widget-content{border:1px solid #dddcda !important;border-radius:0 !important;background:#fff;color:#555 !important;-webkit-box-shadow:0 6px 6px rgba(0,0,0,0.1);box-shadow:0 6px 6px rgba(0,0,0,0.1)}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{opacity:.2}.ui-datepicker .ui-datepicker-prev:hover,.ui-datepicker .ui-datepicker-next:hover{background:#fff !important;border:none;margin:1px}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:none !important;background:#f7f7f7 !important;color:#7a7a7a !important}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:none !important;border:1px solid #b2b2b2 !important}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #6fdbe8 !important;background:#ddf6fa !important}.status-bar-body{color:white;position:fixed;width:100%;background-color:rgba(0,0,0,0.7);text-align:center;padding:20px;z-index:9999999;bottom:0px;display:block;line-height:20px}.status-bar-close{color:white;fonfont-weight:bold;font-size:21px;cursor:pointer}.status-bar-close:hover{color:white}.status-bar-close i{vertical-align:top !important;padding-top:3px}.status-bar-content i{margin-right:10px;font-size:21px;vertical-align:middle}.status-bar-content .showMore{color:#6fdbe8;float:right;margin-left:10px;font-size:.7em;cursor:pointer;vertical-align:middle;white-space:nowrap}.status-bar-content .status-bar-details{text-align:left;font-size:.7em;margin-top:20px;max-height:200px;overflow:auto}.status-bar-content span{vertical-align:middle}.status-bar-content i.error,.status-bar-content i.fatal{color:#ff8989}.status-bar-content i.warning{color:#fdd198}.status-bar-content i.info,.status-bar-content i.debug{color:#6fdbe8}.status-bar-content i.success{color:#85CA2B}.highlight{background-color:#fff8e0}.alert-default{color:#555;background-color:#f7f7f7;border-color:#ededed;font-size:13px}.alert-default .info{margin:10px 0}.alert-success{color:#84be5e;background-color:#f7fbf4;border-color:#97d271}.alert-warning{color:#e9b168;background-color:#fffbf7;border-color:#fdd198}.alert-danger{color:#ff8989;background-color:#fff6f6;border-color:#ff8989}.data-saved{padding-left:10px;color:#6fdbe8}img.bounceIn{-webkit-animation-duration:800ms;-moz-animation-duration:800ms;animation-duration:800ms}.tags .tag{margin-top:5px;border-radius:2px;padding:4px 8px;text-transform:uppercase;max-width:150px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ProsemirrorEditor.fullscreen{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9998}.ProsemirrorEditor.fullscreen .ProseMirror-menubar-wrapper{height:100%}.ProsemirrorEditor.fullscreen .humhub-ui-richtext{max-height:none !important}.ProsemirrorEditor.fullscreen .ProseMirror{position:static;overflow:auto;heigh:100%;height:calc(100% - 26px);height:-o-calc(100% - 26px);height:-webkit-calc(100% - 26px)}.ProsemirrorEditor.fullscreen .ProseMirror-menubar{position:static !important;top:0 !important;left:0 !important;margin:0 !important;width:100% !important}.ProsemirrorEditor .ProseMirror{padding-right:12px}.ProsemirrorEditor .ProseMirror-menu{margin:0 -4px;line-height:1}.ProsemirrorEditor .ProseMirror-tooltip .ProseMirror-menu{width:-webkit-fit-content;width:fit-content;white-space:pre}.ProsemirrorEditor .ProseMirror-menuitem{margin-right:0;display:inline-block}.ProsemirrorEditor .ProseMirror-menuseparator{border-right:1px solid #ddd;margin-right:3px}.ProsemirrorEditor .ProseMirror-menubar-wrapper{z-index:200}.ProsemirrorEditor .ProseMirror-menuitem .ProseMirror-menu-group{border-right:1px solid #ddd}.ProsemirrorEditor .ProseMirror-menuitem .ProseMirror-menu-group.last{border-right:none}.ProsemirrorEditor .ProseMirror-menuitem .seperator{border-right:1px solid #ddd;margin-right:2px;padding-right:2px}.ProsemirrorEditor .ProseMirror-menu-dropdown,.ProsemirrorEditor .ProseMirror-menu-dropdown-menu{font-size:90%;white-space:nowrap}.ProsemirrorEditor .ProseMirror-menu-dropdown{cursor:pointer;position:relative;padding-right:15px !important}.ProsemirrorEditor .ProseMirror-menu-dropdown-wrap{padding:1px 0 1px 0;display:inline-block;position:relative}.ProsemirrorEditor .ProseMirror-menu-dropdown-right{right:0}.ProsemirrorEditor .ProseMirror-menu-dropdown:after{content:"";border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid currentColor;opacity:.6;position:absolute;right:4px;top:calc(50% - 2px)}.ProsemirrorEditor .ProseMirror-menu-submenu{border-top-right-radius:4px}.ProsemirrorEditor .ProseMirror-menu-dropdown-menu,.ProsemirrorEditor .ProseMirror-menu-submenu{position:absolute;background:white;color:#666;border:1px solid #aaa;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.ProsemirrorEditor .ProseMirror-menu-dropdown-menu{z-index:15;min-width:6em;margin-top:2px}.ProsemirrorEditor .ProseMirror-menu-dropdown-item{cursor:pointer}.ProsemirrorEditor .ProseMirror-menu-dropdown-item div[title],.ProsemirrorEditor .ProseMirror-menu-submenu-wrap{padding:4px}.ProsemirrorEditor .ProseMirror-menu-dropdown-item:hover{background:#f2f2f2}.ProsemirrorEditor .ProseMirror-menu-submenu-wrap{position:relative}.ProsemirrorEditor .ProseMirror-menu-submenu-label:after{content:"";border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:4px solid currentColor;opacity:.6;position:absolute;right:4px;top:calc(50% - 4px)}.ProsemirrorEditor .ProseMirror-menu-submenu{display:none;min-width:4em;left:100%;top:0}.ProsemirrorEditor .ProseMirror-menu-active{background:#eee;border-radius:4px;border:1px solid #ededed !important}.ProsemirrorEditor .ProseMirror-menu-disabled{opacity:.3}.ProsemirrorEditor .ProseMirror-menu-submenu-wrap:hover .ProseMirror-menu-submenu,.ProsemirrorEditor .ProseMirror-menu-submenu-wrap-active .ProseMirror-menu-submenu{display:block}.ProsemirrorEditor .ProseMirror-icon{display:inline-block;line-height:.8;vertical-align:-2px;padding:1px 7px;cursor:pointer;border:1px solid transparent}.ProsemirrorEditor .ProseMirror-menu-disabled.ProseMirror-icon{cursor:default}.ProsemirrorEditor .ProseMirror-icon svg{fill:currentColor;height:1em}.ProsemirrorEditor .ProseMirror-icon span{vertical-align:text-top}.ProsemirrorEditor.plainMenu .ProseMirror{border-top-left-radius:0 !important;border-top-right-radius:0 !important;border-top-width:1px !important}.ProsemirrorEditor.plainMenu .ProseMirror-menu-group{padding:5px}.ProsemirrorEditor.plainMenu .ProseMirror-menuitem .ProseMirror-menu-group{padding:2px}.ProsemirrorEditor.plainMenu .ProseMirror-menubar~.ProseMirror-focused{border-color:#6fdbe8 !important}.ProsemirrorEditor.plainMenu .ProseMirror-textblock-dropdown{min-width:3em}.ProsemirrorEditor.plainMenu .ProseMirror-menubar-wrapper{z-index:8}.ProsemirrorEditor.plainMenu .ProseMirror-menubar{background-color:#f7f7f7;border-top-left-radius:4px;border-top-right-radius:4px;border:1px solid #ddd;position:relative;min-height:1em;color:#666;padding:1px 6px 1px 0;top:0;left:0;right:0;z-index:10;-moz-box-sizing:border-box;box-sizing:border-box;overflow:visible}.ProsemirrorEditor.focusMenu .form-control:focus{border-top-left-radius:0 !important}.ProsemirrorEditor.focusMenu .ProseMirror-menubar{display:table;min-height:1em;color:#666;padding:2px 6px;top:0;left:0;right:0;z-index:10;-moz-box-sizing:border-box;box-sizing:border-box;overflow:visible;margin-top:-26px;background:white;border:1px solid #d7d7d7;border-bottom:0;border-top:2px solid #d7d7d7;border-top-left-radius:4px;border-top-right-radius:4px;float:left}@-moz-document url-prefix(){.ProsemirrorEditor.focusMenu .ProseMirror-menubar{margin-top:-27px}}.ProsemirrorEditor .ProseMirror{position:relative;word-wrap:break-word;white-space:pre-wrap;-webkit-font-variant-ligatures:none;font-variant-ligatures:none}.ProsemirrorEditor .ProseMirror ul,.ProsemirrorEditor .ProseMirror ol{cursor:default}.ProsemirrorEditor .ProseMirror pre{white-space:pre-wrap}.ProsemirrorEditor .ProseMirror li{position:relative}.ProsemirrorEditor .ProseMirror img{max-width:100%}.ProsemirrorEditor .ProseMirror-hideselection *::selection{background:transparent}.ProsemirrorEditor .ProseMirror-hideselection *::-moz-selection{background:transparent}.ProsemirrorEditor .ProseMirror-selectednode{outline:2px dashed #8cf}.ProsemirrorEditor li.ProseMirror-selectednode{outline:none}.ProsemirrorEditor li.ProseMirror-selectednode:after{content:"";position:absolute;left:-32px;right:-2px;top:-2px;bottom:-2px;border:2px solid #8cf;pointer-events:none}.ProsemirrorEditor .ProseMirror-textblock-dropdown{min-width:3em}.ProsemirrorEditor .ProseMirror-menu{margin:0 -4px;line-height:1}.ProsemirrorEditor .ProseMirror-tooltip .ProseMirror-menu{width:-webkit-fit-content;width:fit-content;white-space:pre}.ProsemirrorEditor .ProseMirror-gapcursor{display:none;pointer-events:none;position:absolute}.ProsemirrorEditor .ProseMirror-gapcursor:after{content:"";display:block;position:absolute;top:-2px;width:20px;border-top:1px solid black;animation:ProseMirror-cursor-blink 1.1s steps(2, start) infinite}@keyframes ProseMirror-cursor-blink{to{visibility:hidden}}.ProsemirrorEditor .ProseMirror-focused .ProseMirror-gapcursor{display:block}.ProsemirrorEditor .ProseMirror-example-setup-style hr{padding:2px 10px;border:none;margin:1em 0}.ProsemirrorEditor .ProseMirror-example-setup-style hr:after{content:"";display:block;height:1px;background-color:silver;line-height:2px}.ProsemirrorEditor .ProseMirror ul,.ProsemirrorEditor .ProseMirror ol{padding-left:30px}.ProsemirrorEditor .ProseMirror blockquote{padding-left:1em;border-left:3px solid #eee;margin-left:0;margin-right:0}.ProsemirrorEditor .ProseMirror-example-setup-style img{cursor:default}.ProsemirrorEditor .ProseMirror p{margin-top:1em}.ProsemirrorEditor .ProseMirror p:first-child{margin:0px}.ProsemirrorEditor .ProseMirror p:first-child+*{margin-top:1em}.ProsemirrorEditor .ProsemirrorEditor{position:relative}.ProsemirrorEditor .ProsemirrorEditor .ProseMirror{padding-right:12px !important}.ProsemirrorEditor .ProsemirrorEditor img{max-width:100%}.ProsemirrorEditor .ProseMirror h1:first-child,.ProsemirrorEditor .ProseMirror h2:first-child,.ProsemirrorEditor .ProseMirror h3:first-child,.ProsemirrorEditor .ProseMirror h4:first-child,.ProsemirrorEditor .ProseMirror h5:first-child,.ProsemirrorEditor .ProseMirror h6:first-child{margin-top:10px}.ProsemirrorEditor .ProseMirror [data-mention]{color:#6fdbe8}.ProsemirrorEditor .ProseMirror{outline:none}.ProsemirrorEditor .ProseMirror [data-oembed]{font-size:0}.ProsemirrorEditor .ProseMirror iframe{pointer-events:none;display:block}.ProsemirrorEditor .ProseMirror p{margin-bottom:1em}.ProsemirrorEditor .ProseMirror-textblock-dropdown{min-width:3em}.ProsemirrorEditor .ProseMirror .placeholder{padding:0px !important;pointer-events:none;height:0}.ProsemirrorEditor .ProseMirror:focus .placeholder{display:none}.ProsemirrorEditor .ProseMirror .tableWrapper{overflow-x:auto}.ProsemirrorEditor .ProseMirror .column-resize-handle{position:absolute;right:-2px;top:0;bottom:0;width:4px;z-index:20;background-color:#adf;pointer-events:none}.ProsemirrorEditor .ProseMirror.resize-cursor{cursor:ew-resize;cursor:col-resize}.ProsemirrorEditor .ProseMirror .selectedCell:after{z-index:2;position:absolute;content:"";left:0;right:0;top:0;bottom:0;background:rgba(200,200,255,0.4);pointer-events:none}.ProsemirrorEditor .ProseMirror-menubar-wrapper{position:relative;outline:none}.ProsemirrorEditor .ProseMirror table{margin:0}.ProsemirrorEditor .ProseMirror .tableWrapper{margin:1em 0}.ProseMirror-prompt{background:white;padding:5px 10px 5px 15px;border:1px solid silver;position:fixed;border-radius:3px;min-width:300px;z-index:999999;box-shadow:-0.5px 2px 5px rgba(0,0,0,0.2)}.ProseMirror-prompt h5{font-weight:bold;font-size:100%;margin:15px 0}.ProseMirror-prompt input{margin-bottom:5px}.ProseMirror-prompt-close{position:absolute;left:2px;top:1px;color:#666;border:none;background:transparent;padding:0}.ProseMirror-prompt-close:after{content:"✕";font-size:12px}.ProseMirror-invalid{background:#ffc;border:1px solid #cc7;border-radius:4px;padding:5px 10px;position:absolute;min-width:10em}.ProseMirror-prompt-buttons{margin:15px 0;text-align:center}.atwho-view .cur{border-left:3px solid #59d6e4;background-color:#f7f7f7 !important}.atwho-user,.atwho-space,.atwho-input a{color:#59d6e4}.atwho-input a:hover{color:#59d6e4}.atwho-view strong{background-color:#f9f0d2}.atwho-view .cur strong{background-color:#f9f0d2}[data-emoji-category]{max-height:200px;display:block;position:relative;overflow:auto}[data-emoji-category] .atwho-emoji-entry{width:24px;height:28px;overflow:hidden}[data-emoji-category] .atwho-emoji-entry.cur{background-color:#ededed !important}.emoji-nav{padding-top:10px}.emoji-nav .emoji-nav-item{border-top:2px solid #fff8e0}.emoji-nav .emoji-nav-item.cur{border-left:0px;border-top:2px solid #6fdbe8}@media screen and (max-width:768px){.ProsemirrorEditor.focusMenu .ProseMirror-menubar{min-height:1em}}@media only screen and (max-width : 768px){body{padding-top:105px}#layout-content .left-navigation .list-group{-webkit-overflow-scrolling:auto;white-space:nowrap;overflow-x:auto}#layout-content .left-navigation .list-group::-webkit-scrollbar{-webkit-appearance:none}#layout-content .left-navigation .list-group::-webkit-scrollbar:vertical{width:8px}#layout-content .left-navigation .list-group::-webkit-scrollbar:horizontal{height:8px}#layout-content .left-navigation .list-group::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0.5);border-radius:10px;border:2px solid #ffffff}#layout-content .left-navigation .list-group::-webkit-scrollbar-track{border-radius:10px;background-color:#ffffff}#layout-content .table-responsive::-webkit-scrollbar{-webkit-appearance:none}#layout-content .table-responsive::-webkit-scrollbar:vertical{width:8px}#layout-content .table-responsive::-webkit-scrollbar:horizontal{height:8px}#layout-content .table-responsive::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0.5);border-radius:10px;border:2px solid #ffffff}#layout-content .table-responsive::-webkit-scrollbar-track{border-radius:10px;background-color:#ffffff}#layout-content .panel{margin-bottom:5px}#layout-content .panel .statistics .entry{margin-left:10px}#layout-content>.container{padding-right:2px !important;padding-left:2px !important;overflow-x:hidden}#layout-content .layout-nav-container .panel-heading{display:none}#layout-content .panel-profile-header #profilefileupload,#layout-content .panel-profile-header .profile-user-photo-container,#layout-content .panel-profile-header .space-acronym,#layout-content .panel-profile-header .profile-user-photo{height:100px !important;width:100px !important}#layout-content .image-upload-container .image-upload-buttons{right:2px !important}#layout-content .space-acronym{padding:6px 0 !important}#layout-content .panel-profile .panel-profile-header .img-profile-header-background{min-height:80px !important}#layout-content .panel-profile .panel-profile-header .img-profile-data{padding-top:50px !important}.modal-dialog{padding:0 !important;margin:2px !important}.dropdown-menu>li a,.nav-pills .dropdown-menu li a,.nav-tabs .dropdown-menu li a,.account .dropdown-menu li a,.modal .dropdown-menu li a,.panel .dropdown-menu li a,.nav-tabs .dropdown-menu li a{padding-top:10px;padding-bottom:10px}select.form-control:not([multiple]){padding-right:23px;width:auto}.modal.in{padding-right:0 !important}.load-suppressed{margin-top:-8px;margin-bottom:5px}.ProsemirrorEditor .ProseMirror-menuitem{font-size:1.2em !important}}/*! Select2 humhub Theme v0.1.0-beta.4 | MIT License | github.com/select2/select2-humhub-theme */.select2-container--humhub{display:block}.select2-container--humhub .select2-selection{background-color:#fff;border:2px solid #ededed;border-radius:4px;color:#555;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;outline:0}.select2-container--humhub .select2-search--dropdown .select2-search__field{background-color:#fff;border:2px solid #ededed;border-radius:4px;color:#555;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px}.select2-container--humhub .select2-search__field{outline:0}.select2-container--humhub .select2-search__field::-webkit-input-placeholder{color:#999}.select2-container--humhub .select2-search__field:-moz-placeholder{color:#999}.select2-container--humhub .select2-search__field::-moz-placeholder{color:#999;opacity:1}.select2-container--humhub .select2-search__field:-ms-input-placeholder{color:#999}.select2-container--humhub .select2-results__option[role=group]{padding:0}.select2-container--humhub .select2-results__option[aria-disabled=true]{color:#777;cursor:not-allowed}.select2-container--humhub .select2-results__option[aria-selected=true]{background-color:#f5f5f5;color:#262626;border-left:3px solid transparent}.select2-container--humhub .select2-results__option[aria-selected=false]{border-left:3px solid transparent}.select2-container--humhub .select2-results__option--highlighted[aria-selected]{background-color:#f7f7f7;border-left:3px solid #6fdbe8;color:#555}.select2-container--humhub .select2-results__option .select2-results__option{padding:6px 12px}.select2-container--humhub .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--humhub .select2-results__option .select2-results__option .select2-results__option{margin-left:-12px;padding-left:24px}.select2-container--humhub .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-24px;padding-left:36px}.select2-container--humhub .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-36px;padding-left:48px}.select2-container--humhub .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-48px;padding-left:60px}.select2-container--humhub .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-60px;padding-left:72px}.select2-container--humhub .select2-results__group{color:#777;display:block;padding:6px 12px;font-size:12px;line-height:1.42857143;white-space:nowrap}.select2-container--humhub.select2-container--focus .select2-selection,.select2-container--humhub.select2-container--open .select2-selection{border:2px solid #6fdbe8;outline:0;box-shadow:none}.select2-container--humhub.select2-container--open .select2-selection .select2-selection__arrow b{border-color:transparent transparent #999 transparent;border-width:0 4px 4px 4px}.select2-container--humhub .select2-selection__clear{color:#999;cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--humhub .select2-selection__clear:hover{color:#333}.select2-container--humhub.select2-container--disabled .select2-selection{border-color:#ccc;-webkit-box-shadow:none;box-shadow:none}.select2-container--humhub.select2-container--disabled .select2-selection,.select2-container--humhub.select2-container--disabled .select2-search__field{cursor:not-allowed}.select2-container--humhub.select2-container--disabled .select2-selection,.select2-container--humhub.select2-container--disabled .select2-selection--multiple .select2-selection__choice{background-color:#eee}.select2-container--humhub.select2-container--disabled .select2-selection__clear,.select2-container--humhub.select2-container--disabled .select2-selection--multiple .select2-selection__choice__remove{display:none}.select2-container--humhub .select2-dropdown{-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);border-color:#d7d7d7;overflow-x:hidden;margin-top:-1px}.select2-container--humhub .select2-dropdown--above{margin-top:1px}.select2-container--humhub .select2-results>.select2-results__options{max-height:400px;overflow-y:auto}.select2-container--humhub .select2-selection--single{height:34px;line-height:1.42857143;padding:6px 24px 6px 12px}.select2-container--humhub .select2-selection--single .select2-selection__arrow{position:absolute;bottom:0;right:12px;top:0;width:4px}.select2-container--humhub .select2-selection--single .select2-selection__arrow b{border-color:#999 transparent transparent transparent;border-style:solid;border-width:4px 4px 0 4px;height:0;left:0;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--humhub .select2-selection--single .select2-selection__rendered{color:#555;padding:0}.select2-container--humhub .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--humhub .select2-selection--multiple{min-height:34px;padding:2px}.select2-container--humhub .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;display:block;line-height:1.42857143;list-style:none;margin:0;overflow:hidden;padding:0;width:100%;text-overflow:ellipsis;white-space:nowrap}.select2-container--humhub .select2-selection--multiple .select2-selection__placeholder{color:#999;float:left;margin-top:5px}.select2-container--humhub .select2-selection--multiple .select2-selection__choice{color:#555;border-radius:4px;cursor:default;padding:0 6px;background-color:#6fdbe8;color:#fff;border-radius:3px;font-size:12px !important;padding:0 5px 2px 2px;float:left;margin:2px;height:28px}.select2-container--humhub .select2-selection--multiple .select2-selection__choice img,.select2-container--humhub .select2-selection--multiple .select2-selection__choice div{margin-right:5px}.select2-container--humhub .select2-selection--multiple .select2-selection__choice span.no-image{line-height:27px;padding-left:5px}.select2-container--humhub .select2-selection--multiple .select2-selection__choice i{margin:0px 2px;line-height:27px}.select2-container--humhub .select2-selection--multiple .select2-selection__choice .picker-close{cursor:pointer}.select2-container--humhub .select2-selection--multiple .select2-search--inline .select2-search__field{background:transparent;padding:0 5px;width:auto !important;height:32px;line-height:1.42857143;margin-top:0;min-width:5em}.select2-container--humhub .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:none;font-weight:bold;margin-right:3px}.select2-container--humhub .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--humhub .select2-selection--multiple .select2-selection__clear{margin-top:6px}.select2-container--humhub.input-sm,.select2-container--humhub.input-lg{border-radius:0;font-size:12px;height:auto;line-height:1;padding:0}.select2-container--humhub.input-sm .select2-selection--single,.input-group-sm .select2-container--humhub .select2-selection--single,.form-group-sm .select2-container--humhub .select2-selection--single{border-radius:3px;font-size:12px;height:30px;line-height:1.5;padding:5px 22px 5px 10px}.select2-container--humhub.input-sm .select2-selection--single .select2-selection__arrow b,.input-group-sm .select2-container--humhub .select2-selection--single .select2-selection__arrow b,.form-group-sm .select2-container--humhub .select2-selection--single .select2-selection__arrow b{margin-left:-5px}.select2-container--humhub.input-sm .select2-selection--multiple,.input-group-sm .select2-container--humhub .select2-selection--multiple,.form-group-sm .select2-container--humhub .select2-selection--multiple{min-height:30px}.select2-container--humhub.input-sm .select2-selection--multiple .select2-selection__choice,.input-group-sm .select2-container--humhub .select2-selection--multiple .select2-selection__choice,.form-group-sm .select2-container--humhub .select2-selection--multiple .select2-selection__choice{font-size:12px;line-height:1.5;margin:4px 0 0 5px;padding:0 5px}.select2-container--humhub.input-sm .select2-selection--multiple .select2-search--inline .select2-search__field,.input-group-sm .select2-container--humhub .select2-selection--multiple .select2-search--inline .select2-search__field,.form-group-sm .select2-container--humhub .select2-selection--multiple .select2-search--inline .select2-search__field{padding:0 10px;font-size:12px;height:28px;line-height:1.5}.select2-container--humhub.input-sm .select2-selection--multiple .select2-selection__clear,.input-group-sm .select2-container--humhub .select2-selection--multiple .select2-selection__clear,.form-group-sm .select2-container--humhub .select2-selection--multiple .select2-selection__clear{margin-top:5px}.select2-container--humhub.input-lg .select2-selection--single,.input-group-lg .select2-container--humhub .select2-selection--single,.form-group-lg .select2-container--humhub .select2-selection--single{border-radius:6px;font-size:18px;height:46px;line-height:1.3333333;padding:10px 31px 10px 16px}.select2-container--humhub.input-lg .select2-selection--single .select2-selection__arrow,.input-group-lg .select2-container--humhub .select2-selection--single .select2-selection__arrow,.form-group-lg .select2-container--humhub .select2-selection--single .select2-selection__arrow{width:5px}.select2-container--humhub.input-lg .select2-selection--single .select2-selection__arrow b,.input-group-lg .select2-container--humhub .select2-selection--single .select2-selection__arrow b,.form-group-lg .select2-container--humhub .select2-selection--single .select2-selection__arrow b{border-width:5px 5px 0 5px;margin-left:-5px;margin-left:-10px;margin-top:-2.5px}.select2-container--humhub.input-lg .select2-selection--multiple,.input-group-lg .select2-container--humhub .select2-selection--multiple,.form-group-lg .select2-container--humhub .select2-selection--multiple{min-height:46px}.select2-container--humhub.input-lg .select2-selection--multiple .select2-selection__choice,.input-group-lg .select2-container--humhub .select2-selection--multiple .select2-selection__choice,.form-group-lg .select2-container--humhub .select2-selection--multiple .select2-selection__choice{font-size:18px;line-height:1.3333333;border-radius:4px;margin:9px 0 0 8px;padding:0 10px}.select2-container--humhub.input-lg .select2-selection--multiple .select2-search--inline .select2-search__field,.input-group-lg .select2-container--humhub .select2-selection--multiple .select2-search--inline .select2-search__field,.form-group-lg .select2-container--humhub .select2-selection--multiple .select2-search--inline .select2-search__field{padding:0 16px;font-size:18px;height:44px;line-height:1.3333333}.select2-container--humhub.input-lg .select2-selection--multiple .select2-selection__clear,.input-group-lg .select2-container--humhub .select2-selection--multiple .select2-selection__clear,.form-group-lg .select2-container--humhub .select2-selection--multiple .select2-selection__clear{margin-top:10px}.select2-container--humhub.input-lg.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #999 transparent;border-width:0 5px 5px 5px}.input-group-lg .select2-container--humhub.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #999 transparent;border-width:0 5px 5px 5px}.select2-container--humhub[dir="rtl"] .select2-selection--single{padding-left:24px;padding-right:12px}.select2-container--humhub[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:0;padding-left:0;text-align:right}.select2-container--humhub[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--humhub[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:12px;right:auto}.select2-container--humhub[dir="rtl"] .select2-selection--single .select2-selection__arrow b{margin-left:0}.select2-container--humhub[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--humhub[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--humhub[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:0;margin-right:6px}.select2-container--humhub[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.has-warning .select2-dropdown,.has-warning .select2-selection{border-color:#fdd198}.has-warning .select2-container--focus .select2-selection,.has-warning .select2-container--open .select2-selection{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fffefc;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fffefc;border-color:#fcbb66}.has-warning.select2-drop-active{border-color:#fcbb66}.has-warning.select2-drop-active.select2-drop.select2-drop-above{border-top-color:#fcbb66}.has-error .select2-dropdown,.has-error .select2-selection{border-color:#ff8989}.has-error .select2-container--focus .select2-selection,.has-error .select2-container--open .select2-selection{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffefef;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffefef;border-color:#ff5656}.has-error.select2-drop-active{border-color:#ff5656}.has-error.select2-drop-active.select2-drop.select2-drop-above{border-top-color:#ff5656}.has-success .select2-dropdown,.has-success .select2-selection{border-color:#97d271}.has-success .select2-container--focus .select2-selection,.has-success .select2-container--open .select2-selection{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d0ebbe;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d0ebbe;border-color:#7bc64a}.has-success.select2-drop-active{border-color:#7bc64a}.has-success.select2-drop-active.select2-drop.select2-drop-above{border-top-color:#7bc64a}.input-group .select2-container--humhub{display:table;table-layout:fixed;position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group.select2-humhub-prepend .select2-container--humhub .select2-selection{border-bottom-left-radius:0;border-top-left-radius:0}.input-group.select2-humhub-append .select2-container--humhub .select2-selection{border-bottom-right-radius:0;border-top-right-radius:0}.select2-humhub-append .select2-container--humhub,.select2-humhub-prepend .select2-container--humhub,.select2-humhub-append .input-group-btn,.select2-humhub-prepend .input-group-btn,.select2-humhub-append .input-group-btn .btn,.select2-humhub-prepend .input-group-btn .btn{vertical-align:top}.form-control.select2-hidden-accessible{position:absolute !important;width:1px !important}.form-inline .select2-container--humhub{display:inline-block}ul.tag_input{list-style:none;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;padding:0 0 9px 4px}ul.tag_input li img{margin:0 5px 0 0}.tag_input_field{outline:none;border:none !important;padding:5px 4px 0 !important;width:170px;margin:2px 0 0 !important}.userInput,.spaceInput{background-color:#6fdbe8;font-weight:600;color:#fff;border-radius:3px;font-size:12px !important;padding:2px;float:left;margin:3px 4px 0 0}.userInput i,.spaceInput i{padding:0 6px;font-size:14px;cursor:pointer;line-height:8px}
\ No newline at end of file
+.colorDefault{color:#ededed}.backgroundDefault{background:#ededed}.borderDefault{border-color:#ededed}.colorPrimary{color:#708fa0 !important}.backgroundPrimary{background:#708fa0 !important}.borderPrimary{border-color:#708fa0 !important}.colorInfo{color:#6fdbe8 !important}.backgroundInfo{background:#6fdbe8 !important}.borderInfo{border-color:#6fdbe8 !important}.colorSuccess{color:#97d271 !important}.backgroundSuccess{background:#97d271 !important}.borderSuccess{border-color:#97d271 !important}.colorWarning{color:#fdd198 !important}.backgroundWarning{background:#fdd198 !important}.borderWarning{border-color:#fdd198 !important}.colorDanger{color:#ff8989 !important}.backgroundDanger{background:#ff8989 !important}.borderDanger{border-color:#ff8989 !important}.colorFont1{color:#bac2c7 !important}.colorFont2{color:#7a7a7a !important}.colorFont3{color:#555 !important}.colorFont4{color:#bebebe !important}.colorFont5{color:#aeaeae !important}.heading{font-size:16px;font-weight:300;color:#555;background-color:white;border:none;padding:10px}.text-center{text-align:center !important}.text-break{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.img-rounded{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}body{padding-top:130px;background-color:#ededed;color:#777;font-family:'Open Sans',sans-serif}body a,body a:hover,body a:focus,body a:active,body a.active{color:#555;text-decoration:none}@media (max-width:920px){body{padding-top:115px}}@media (min-width:768px) and (max-width:920px){body{padding-top:120px}}a:hover{text-decoration:none}hr{margin-top:10px;margin-bottom:10px}.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{position:inherit}.layout-content-container,.layout-nav-container{padding:0 10px 0 15px}.layout-sidebar-container{padding:0 15px 0 5px}@media (max-width:768px){.layout-nav-container .left-navigation{margin-bottom:0px}.layout-nav-container,.layout-content-container{padding:0px 15px}}@media (min-width:768px) and (max-width:920px){#topbar-first .container,#topbar-second .container{padding-left:10px;padding-right:20px}}h4{font-weight:300;font-size:150%}input[type=text],input[type=password],input[type=select]{-webkit-appearance:none;-moz-appearance:none;appearance:none}.powered,.powered a{color:#b8c7d3 !important}.langSwitcher{display:inline-block}[data-ui-show-more]{overflow:hidden}.topbar{position:fixed;display:block;height:50px;width:100%;padding-left:15px;padding-right:15px}.topbar ul.nav{float:left}.topbar ul.nav>li{float:left}.topbar ul.nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}.topbar .dropdown-footer{margin:10px}.topbar .dropdown-header{font-size:16px;padding:3px 10px;margin-bottom:10px;font-weight:300;color:#bebebe}.topbar .dropdown-header .dropdown-header-link{position:absolute;top:2px;right:10px}.topbar .dropdown-header .dropdown-header-link a{color:#6fdbe8 !important;font-size:12px;font-weight:normal}.topbar .dropdown-header:hover{color:#bebebe}#topbar-first{background-color:#708fa0;top:0;z-index:1030;color:white}#topbar-first .nav>li>a:hover,#topbar-first .nav>.open>a{background-color:#8fa7b4}#topbar-first .nav>.account{height:50px;margin-left:20px}#topbar-first .nav>.account img{margin-left:10px}#topbar-first .nav>.account .dropdown-toggle{padding:10px 5px 8px;line-height:1.1em;text-align:left}#topbar-first .nav>.account .dropdown-toggle span{font-size:12px}#topbar-first .topbar-brand{position:relative;z-index:2}#topbar-first .topbar-actions{position:relative;z-index:3}#topbar-first .notifications{position:absolute;left:0;right:0;text-align:center;z-index:1}#topbar-first .notifications .btn-group{position:relative;text-align:left}#topbar-first .notifications .btn-group>a{padding:5px 10px;margin:10px 2px;display:inline-block;border-radius:2px;text-decoration:none;text-align:left}#topbar-first .notifications .btn-group>.label{position:absolute;top:4px;right:-2px}#topbar-first .notifications .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid;border-width:10px;content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff;z-index:1035}#topbar-first .notifications .arrow{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid;z-index:1001;border-width:11px;left:50%;margin-left:-18px;border-top-width:0;border-bottom-color:rgba(0,0,0,0.15);top:-19px;z-index:1035}#topbar-first .notifications .dropdown-menu{width:350px;margin-left:-148px}#topbar-first .notifications .dropdown-menu ul.media-list{max-height:400px;overflow:auto}#topbar-first .notifications .dropdown-menu li{position:relative}#topbar-first .notifications .dropdown-menu li i.approval{position:absolute;left:2px;top:36px;font-size:14px}#topbar-first .notifications .dropdown-menu li i.accepted{color:#5cb85c}#topbar-first .notifications .dropdown-menu li i.declined{color:#d9534f}#topbar-first .notifications .dropdown-menu li .media{position:relative}#topbar-first .notifications .dropdown-menu li .media .img-space{position:absolute;top:14px;left:14px}#topbar-first .dropdown-footer{margin:10px 10px 5px}#topbar-first a{color:white}#topbar-first .caret{border-top-color:#bebebe}#topbar-first .btn-group>a{background-color:#7f9baa}#topbar-first .btn-enter{background-color:#7f9baa;margin:6px 0}#topbar-first .btn-enter:hover{background-color:#89a2b0}#topbar-first .media-list a{color:#555;padding:0}#topbar-first .media-list li{color:#555}#topbar-first .media-list li i.accepted{color:#6fdbe8 !important}#topbar-first .media-list li i.declined{color:#ff8989 !important}#topbar-first .media-list li.placeholder{border-bottom:none}#topbar-first .media-list .media .media-body .label{padding:0.1em 0.5em}#topbar-first .account .user-title{text-align:right}#topbar-first .account .user-title span{color:#d7d7d7}#topbar-first .dropdown.account>a,#topbar-first .dropdown.account.open>a,#topbar-first .dropdown.account>a:hover,#topbar-first .dropdown.account.open>a:hover{background-color:#708fa0}#topbar-second{top:50px;background-color:#fff;z-index:1029;background-image:none;-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1);border-bottom:1px solid #d4d4d4}#topbar-second .dropdown-menu{padding-top:0;padding-bottom:0}#topbar-second .dropdown-menu .divider{margin:0}#topbar-second #space-menu-dropdown,#topbar-second #search-menu-dropdown{width:400px}#topbar-second #space-menu-dropdown .media-list,#topbar-second #search-menu-dropdown .media-list{max-height:400px;overflow:auto}@media screen and (max-width:768px){#topbar-second #space-menu-dropdown .media-list,#topbar-second #search-menu-dropdown .media-list{max-height:200px}}#topbar-second #space-menu-dropdown form,#topbar-second #search-menu-dropdown form{margin:10px}#topbar-second #space-menu-dropdown .search-reset,#topbar-second #search-menu-dropdown .search-reset{position:absolute;color:#BFBFBF;margin:7px;top:0px;right:40px;z-index:10;display:none;cursor:pointer}#topbar-second .nav>li>a{padding:7px 13px 0;text-decoration:none;text-shadow:none;font-weight:600;font-size:10px;min-height:50px;text-transform:uppercase;text-align:center}#topbar-second .nav>li>a:hover,#topbar-second .nav>li>a:active,#topbar-second .nav>li>a:focus{border-bottom:3px solid #6fdbe8;background-color:#f7f7f7;color:#555;text-decoration:none}#topbar-second .nav>li>a i{font-size:14px}#topbar-second .nav>li>a .caret{border-top-color:#7a7a7a}#topbar-second .nav>li.active>a{min-height:47px}#topbar-second .nav>li>ul>li>a{border-left:3px solid #fff;background-color:#fff;color:#555}#topbar-second .nav>li>ul>li>a:hover,#topbar-second .nav>li>ul>li>a.active{border-left:3px solid #6fdbe8;background-color:#f7f7f7;color:#555}#topbar-second .nav>li>a#space-menu{padding-right:13px;border-right:1px solid #ededed}#topbar-second .nav>li>a#search-menu{padding-top:15px}#topbar-second .nav>li>a:hover,#topbar-second .nav .open>a,#topbar-second .nav>li.active{border-bottom:3px solid #6fdbe8;background-color:#f7f7f7;color:#555}#topbar-second .nav>li.active>a:hover{border-bottom:none}#topbar-second #space-menu-dropdown li>ul>li>a>.media .media-body p{color:#bebebe;font-size:11px;margin:0;font-weight:400}@media (max-width:767px){.topbar{padding-left:0;padding-right:0}}.login-container{background-color:#708fa0;background-image:linear-gradient(to right, #708fa0 0%, #8fa7b4 50%, #8fa7b4 100%),linear-gradient(to right, #7f9baa 0%, #bdcbd3 51%, #adbfc9 100%);background-size:100% 100%;position:relative;padding-top:40px}.login-container .text{color:#fff;font-size:12px;margin-bottom:15px}.login-container .text a{color:#fff;text-decoration:underline}.login-container .panel a{color:#6fdbe8}.login-container h1,.login-container h2{color:#fff !important}.login-container .panel{box-shadow:0 0 15px #627d92;-moz-box-shadow:0 0 15px #627d92;-webkit-box-shadow:0 0 15px #627d92}.login-container .panel .panel-heading,.login-container .panel .panel-body{padding:15px}.login-container select{color:#555}#account-login-form .form-group{margin-bottom:10px}.dropdown-menu li a{font-size:13px !important;font-weight:600 !important}.dropdown-menu li a i{margin-right:5px;font-size:14px;display:inline-block;width:14px}.dropdown-menu li a:hover,.dropdown-menu li a:visited,.dropdown-menu li a:hover,.dropdown-menu li a:focus{background:none;cursor:pointer}.dropdown-menu li:hover,.dropdown-menu li.selected{color:#555}.dropdown-menu li:first-child{margin-top:3px}.dropdown-menu li:last-child{margin-bottom:3px}.modal .dropdown-menu,.panel .dropdown-menu,.nav-tabs .dropdown-menu{border:1px solid #d7d7d7}.modal .dropdown-menu li.divider,.panel .dropdown-menu li.divider,.nav-tabs .dropdown-menu li.divider{background-color:#f7f7f7;border-bottom:none;margin:9px 1px !important}.modal .dropdown-menu li,.panel .dropdown-menu li,.nav-tabs .dropdown-menu li{border-left:3px solid white}.modal .dropdown-menu li a,.panel .dropdown-menu li a,.nav-tabs .dropdown-menu li a{color:#555;font-size:14px;font-weight:400;padding:4px 15px}.modal .dropdown-menu li a i,.panel .dropdown-menu li a i,.nav-tabs .dropdown-menu li a i{margin-right:5px}.modal .dropdown-menu li a:hover,.panel .dropdown-menu li a:hover,.nav-tabs .dropdown-menu li a:hover{background:none}.modal .dropdown-menu li:hover,.panel .dropdown-menu li:hover,.nav-tabs .dropdown-menu li:hover,.modal .dropdown-menu li.selected,.panel .dropdown-menu li.selected,.nav-tabs .dropdown-menu li.selected{border-left:3px solid #6fdbe8;background-color:#f7f7f7 !important}ul.contextMenu{border:1px solid #d7d7d7}ul.contextMenu li.divider{background-color:#f7f7f7;border-bottom:none;margin:9px 1px !important}ul.contextMenu li{border-left:3px solid white}ul.contextMenu li a{color:#555;font-size:14px;font-weight:400;padding:4px 15px}ul.contextMenu li a i{margin-right:5px}ul.contextMenu li a:hover{background:none}ul.contextMenu li:hover,ul.contextMenu li.selected{border-left:3px solid #6fdbe8;background-color:#f7f7f7 !important}.media-list li{padding:10px;border-bottom:1px solid #eee;position:relative;border-left:3px solid white;font-size:12px}.media-list li a{color:#555}.media-list .badge-space-type{background-color:#f7f7f7;border:1px solid #d7d7d7;color:#b2b2b2;padding:3px 3px 2px 3px}.media-list li.new{border-left:3px solid #f3fcfd;background-color:#f3fcfd}.media-list li:hover,.media-list li.selected{background-color:#f7f7f7;border-left:3px solid #6fdbe8}.media-list li.placeholder{font-size:14px !important;border-bottom:none}.media-list li.placeholder:hover{background:none !important;border-left:3px solid white}.media-left,.media>.pull-left{padding-right:0;margin-right:10px}.media:after{content:'';clear:both;display:block}.media .time{font-size:11px;color:#bebebe}.media .img-space{position:absolute;top:35px;left:35px}.media .media-body{font-size:13px}.media .media-body h4.media-heading{font-size:14px;font-weight:500;color:#555}.media .media-body h4.media-heading a{color:#555}.media .media-body h4.media-heading small,.media .media-body h4.media-heading small a{font-size:11px;color:#bebebe}.media .media-body h4.media-heading .content{margin-right:35px}.media .media-body .content a{word-break:break-all}.media .media-body h5{color:#aeaeae;font-weight:300;margin-top:5px;margin-bottom:5px;min-height:15px}.media .media-body .module-controls{font-size:85%}.media .media-body .module-controls a{color:#6fdbe8}.media .content a{color:#6fdbe8}.media .content .files a{color:#555}.content span{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.panel{border:none;background-color:#fff;box-shadow:0 0 3px #dadada;-webkit-box-shadow:0 0 3px #dadada;-moz-box-shadow:0 0 3px #dadada;border-radius:4px;position:relative;margin-bottom:15px}.panel h1{font-size:16px;font-weight:300;margin-top:0;color:#555}.panel .panel-heading{font-size:16px;font-weight:300;color:#555;background-color:white;border:none;padding:10px;border-radius:4px}.panel .panel-heading .heading-link{color:#6fdbe8 !important;font-size:0.8em}.panel .panel-body{padding:10px;font-size:13px}.panel .panel-body p{color:#555}.panel .statistics .entry{margin-left:20px;font-size:12px}.panel .statistics .entry .count{color:#6fdbe8;font-weight:600;font-size:20px;line-height:0.8em}.panel h3.media-heading small{font-size:75%}.panel h3.media-heading small a{color:#6fdbe8}.panel-danger{border:2px solid #ff8989}.panel-danger .panel-heading{color:#ff8989}.panel-success{border:2px solid #97d271}.panel-success .panel-heading{color:#97d271}.panel-warning{border:2px solid #fdd198}.panel-warning .panel-heading{color:#fdd198}.panel.profile{position:relative}.panel.profile .controls{position:absolute;top:10px;right:10px}.panel.members .panel-body a img,.panel.groups .panel-body a img,.panel.follower .panel-body a img,.panel.spaces .panel-body a img{margin-bottom:5px}.panel-profile .panel-profile-header{position:relative;border:3px solid #fff;border-top-right-radius:3px;border-top-left-radius:3px}.panel-profile .panel-profile-header .img-profile-header-background{border-radius:3px;min-height:110px}.panel-profile .panel-profile-header .img-profile-data{position:absolute;height:100px;width:100%;bottom:0;left:0;padding-left:180px;padding-top:30px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:#fff;pointer-events:none;background:-moz-linear-gradient(top, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 1%, rgba(0,0,0,0.38) 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(0,0,0,0)), color-stop(1%, rgba(0,0,0,0)), color-stop(100%, rgba(0,0,0,0.38)));background:-webkit-linear-gradient(top, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 1%, rgba(0,0,0,0.38) 100%);background:-o-linear-gradient(top, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 1%, rgba(0,0,0,0.38) 100%);background:-ms-linear-gradient(top, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 1%, rgba(0,0,0,0.38) 100%);background:linear-gradient(to bottom, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 1%, rgba(0,0,0,0.38) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#94000000', GradientType=0)}.panel-profile .panel-profile-header .img-profile-data h1{font-size:30px;font-weight:100;margin-bottom:7px;color:#fff;max-width:600px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.panel-profile .panel-profile-header .img-profile-data h2{font-size:16px;font-weight:400;margin-top:0}.panel-profile .panel-profile-header .img-profile-data h1.space{font-size:30px;font-weight:700}.panel-profile .panel-profile-header .img-profile-data h2.space{font-size:13px;font-weight:300;max-width:600px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.panel-profile .panel-profile-header .profile-user-photo-container{position:absolute;bottom:-50px;left:15px}.panel-profile .panel-profile-header .profile-user-photo-container .profile-user-photo{border:3px solid #fff;border-radius:5px}.panel-profile .panel-profile-controls{padding-left:160px}.panel.pulse,.panel.fadeIn{-webkit-animation-duration:200ms;-moz-animation-duration:200ms;animation-duration:200ms}@media (max-width:767px){.panel-profile-controls{padding-left:0 !important;padding-top:50px}.panel-profile .panel-profile-header .img-profile-data h1{font-size:20px !important}}.panel-body>.tab-menu{margin-left:-10px;margin-right:-10px}.installer .logo{text-align:center}.installer h2{font-weight:100}.installer .panel{margin-top:50px}.installer .panel h3{margin-top:0}.installer .powered,.installer .powered a{color:#bac2c7 !important;margin-top:10px;font-size:12px}.installer .fa{width:18px}.installer .check-ok{color:#97d271}.installer .check-warning{color:#fdd198}.installer .check-error{color:#ff8989}.installer .prerequisites-list ul{list-style:none;padding-left:15px}.installer .prerequisites-list ul li{padding-bottom:5px}.pagination-container{text-align:center}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{background-color:#708fa0;border-color:#708fa0}.pagination>li>a,.pagination>li>span,.pagination>li>a:hover,.pagination>li>a:active,.pagination>li>a:focus{color:#555;cursor:pointer}.well-small{padding:10px;border-radius:3px}.well{border:none;box-shadow:none;background-color:#ededed;margin-bottom:1px}.well hr{margin:15px 0 10px;border-top:1px solid #d9d9d9}.well table>thead{font-size:11px}.tab-sub-menu{padding-left:10px}.tab-sub-menu li>a:hover,.tab-sub-menu li>a:focus{background-color:#f7f7f7;border-bottom-color:#ddd}.tab-sub-menu li.active>a{background-color:#fff;border-bottom-color:transparent}.tab-menu{padding-top:10px;background-color:#fff}.tab-menu .nav-tabs{padding-left:10px}.tab-menu .nav-tabs li>a{padding-top:12px;border-color:#ddd;border-bottom:1px solid #ddd;background-color:#f7f7f7;max-height:41px;outline:none}.tab-menu .nav-tabs li>a:hover,.tab-menu .nav-tabs li>a:focus{padding-top:10px;border-top:3px solid #ddd}.tab-menu .nav-tabs li>a:hover{background-color:#f7f7f7}.tab-menu .nav-tabs li.active>a,.tab-menu .nav-tabs li.active>a:hover{padding-top:10px;border-top:3px solid #6fdbe8}.tab-menu .nav-tabs li.active>a{background-color:#fff;border-bottom-color:transparent}ul.tab-menu{padding-top:10px;background-color:#fff;padding-left:10px}ul.tab-menu-settings li>a{padding-top:12px;border-color:#ddd;border-bottom:1px solid #ddd;background-color:#f7f7f7;max-height:41px;outline:none}ul.tab-menu-settings li>a:hover,ul.tab-menu-settings li>a:focus{padding-top:10px;border-top:3px solid #ddd !important}ul.tab-menu-settings li>a:hover{background-color:#f7f7f7}ul.tab-menu-settings li.active>a,ul.tab-menu-settings li.active>a:hover,ul.tab-menu-settings li.active>a:focus{padding-top:10px;border-top:3px solid #6fdbe8 !important}ul.tab-menu-settings li.active>a{background-color:#fff;border-bottom-color:transparent !important}.nav-pills .dropdown-menu,.nav-tabs .dropdown-menu,.account .dropdown-menu{background-color:#708fa0;border:none}.nav-pills .dropdown-menu li.divider,.nav-tabs .dropdown-menu li.divider,.account .dropdown-menu li.divider{background-color:#628394;border-bottom:none;margin:9px 1px !important}.nav-pills .dropdown-menu li,.nav-tabs .dropdown-menu li,.account .dropdown-menu li{border-left:3px solid #708fa0}.nav-pills .dropdown-menu li a,.nav-tabs .dropdown-menu li a,.account .dropdown-menu li a{color:white;font-weight:400;font-size:13px;padding:4px 15px}.nav-pills .dropdown-menu li a i,.nav-tabs .dropdown-menu li a i,.account .dropdown-menu li a i{margin-right:5px;font-size:14px;display:inline-block;width:14px}.nav-pills .dropdown-menu li a:hover,.nav-tabs .dropdown-menu li a:hover,.account .dropdown-menu li a:hover,.nav-pills .dropdown-menu li a:visited,.nav-tabs .dropdown-menu li a:visited,.account .dropdown-menu li a:visited,.nav-pills .dropdown-menu li a:hover,.nav-tabs .dropdown-menu li a:hover,.account .dropdown-menu li a:hover,.nav-pills .dropdown-menu li a:focus,.nav-tabs .dropdown-menu li a:focus,.account .dropdown-menu li a:focus{background:none}.nav-pills .dropdown-menu li:hover,.nav-tabs .dropdown-menu li:hover,.account .dropdown-menu li:hover,.nav-pills .dropdown-menu li.selected,.nav-tabs .dropdown-menu li.selected,.account .dropdown-menu li.selected{border-left:3px solid #6fdbe8;color:#fff !important;background-color:#628394 !important}.nav-pills.preferences .dropdown .dropdown-toggle{color:#bebebe}.nav-pills.preferences .dropdown.open .dropdown-toggle,.nav-pills.preferences .dropdown.open .dropdown-toggle:hover{background-color:#708fa0}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{background-color:#708fa0}.nav-tabs{margin-bottom:10px}.list-group a [class^="fa-"],.list-group a [class*=" fa-"]{display:inline-block;width:18px}.nav-pills.preferences{position:absolute;right:10px;top:10px}.nav-pills.preferences .dropdown .dropdown-toggle{padding:2px 10px}.nav-pills.preferences .dropdown.open .dropdown-toggle,.nav-pills.preferences .dropdown.open .dropdown-toggle:hover{color:white}.nav-tabs li{font-weight:600;font-size:12px}.tab-content .tab-pane a{color:#6fdbe8}.tab-content .tab-pane .form-group{margin-bottom:5px}.nav-tabs.tabs-center li{float:none;display:inline-block}.nav-tabs.tabs-small li>a{padding:5px 7px}.nav .caret,.nav .caret:hover,.nav .caret:active{border-top-color:#555;border-bottom-color:#555;height:6.928px}.nav li.dropdown>a:hover .caret,.nav li.dropdown>a:active .caret{border-top-color:#555;border-bottom-color:#555}.nav .open>a .caret,.nav .open>a:hover .caret,.nav .open>a:focus .caret{border-top-color:#555;border-bottom-color:#555}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:#ededed;color:#555}.nav .open>a .caret,.nav .open>a:hover .caret,.nav .open>a:focus .caret{color:#555}.footer-nav{filter:opacity(.6);font-size:12px;text-align:center}@media (max-width:991px){.controls-header{text-align:left !important}}.btn{float:none;border:none;-webkit-box-shadow:none;box-shadow:none;-moz-box-shadow:none;background-image:none;text-shadow:none;border-radius:3px;outline:none !important;margin-bottom:0;font-size:14px;font-weight:600;padding:8px 16px}.input.btn{outline:none}.btn-lg{padding:16px 28px}.btn-sm{padding:4px 8px;font-size:12px}.btn-sm i{font-size:14px}.btn-xs{padding:1px 5px;font-size:12px}.btn-default{background:#ededed;color:#7a7a7a !important}.btn-default:hover,.btn-default:focus{background:#e8e8e8;text-decoration:none;color:#7a7a7a}.btn-default:active,.btn-default.active{outline:0;background:#e0e0e0}.btn-default[disabled],.btn-default.disabled{background:#f2f2f2}.btn-default[disabled]:hover,.btn-default.disabled:hover,.btn-default[disabled]:focus,.btn-default.disabled:focus{background:#f2f2f2}.btn-default[disabled]:active,.btn-default.disabled:active,.btn-default[disabled].active,.btn-default.disabled.active{background:#f2f2f2}.btn-primary{background:#708fa0;color:#fff !important}.btn-primary:hover,.btn-primary:focus{background:#628394;text-decoration:none}.btn-primary:active,.btn-primary.active{outline:0;background:#628394 !important}.btn-primary[disabled],.btn-primary.disabled{background:#7f9baa}.btn-primary[disabled]:hover,.btn-primary.disabled:hover,.btn-primary[disabled]:focus,.btn-primary.disabled:focus{background:#7f9baa}.btn-primary[disabled]:active,.btn-primary.disabled:active,.btn-primary[disabled].active,.btn-primary.disabled.active{background:#7f9baa !important}.btn-info{background:#6fdbe8;color:#fff !important}.btn-info:hover,.btn-info:focus{background:#59d6e4 !important;text-decoration:none}.btn-info:active,.btn-info.active{outline:0;background:#59d6e4}.btn-info[disabled],.btn-info.disabled{background:#85e0ec}.btn-info[disabled]:hover,.btn-info.disabled:hover,.btn-info[disabled]:focus,.btn-info.disabled:focus{background:#85e0ec}.btn-info[disabled]:active,.btn-info.disabled:active,.btn-info[disabled].active,.btn-info.disabled.active{background:#85e0ec !important}.btn-danger{background:#ff8989;color:#fff !important}.btn-danger:hover,.btn-danger:focus{background:#ff6f6f;text-decoration:none}.btn-danger:active,.btn-danger.active{outline:0;background:#ff6f6f !important}.btn-danger[disabled],.btn-danger.disabled{background:#ffa3a3}.btn-danger[disabled]:hover,.btn-danger.disabled:hover,.btn-danger[disabled]:focus,.btn-danger.disabled:focus{background:#ffa3a3}.btn-danger[disabled]:active,.btn-danger.disabled:active,.btn-danger[disabled].active,.btn-danger.disabled.active{background:#ffa3a3 !important}.btn-success{background:#97d271;color:#fff !important}.btn-success:hover,.btn-success:focus{background:#89cc5e;text-decoration:none}.btn-success:active,.btn-success.active{outline:0;background:#89cc5e !important}.btn-success[disabled],.btn-success.disabled{background:#a5d884}.btn-success[disabled]:hover,.btn-success.disabled:hover,.btn-success[disabled]:focus,.btn-success.disabled:focus{background:#a5d884}.btn-success[disabled]:active,.btn-success.disabled:active,.btn-success[disabled].active,.btn-success.disabled.active{background:#a5d884 !important}.btn-warning{background:#fdd198;color:#fff !important}.btn-warning:hover,.btn-warning:focus{background:#fdcd8e;text-decoration:none}.btn-warning:active,.btn-warning.active{outline:0;background:#fdcd8e !important}.btn-warning[disabled],.btn-warning.disabled{background:#fddcb1}.btn-warning[disabled]:hover,.btn-warning.disabled:hover,.btn-warning[disabled]:focus,.btn-warning.disabled:focus{background:#fddcb1}.btn-warning[disabled]:active,.btn-warning.disabled:active,.btn-warning[disabled].active,.btn-warning.disabled.active{background:#fddcb1 !important}.radio,.checkbox{margin-top:5px !important;margin-bottom:0}.radio label,.checkbox label{padding-left:10px}.form-control{border:2px solid #ededed;box-shadow:none;min-height:35px}.form-control:focus{border:2px solid #6fdbe8;outline:0;box-shadow:none}.form-control.form-search{border-radius:30px;background-image:url("../img/icon_search16x16.png");background-repeat:no-repeat;background-position:10px 8px;padding-left:34px}.form-group-search{position:relative}.form-group-search .form-button-search{position:absolute;top:4px;right:4px;border-radius:30px}textarea{resize:none;height:1.5em}select.form-control:not([multiple]){-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("../img/select_arrow.png") !important;background-repeat:no-repeat;background-position:right 13px;overflow:hidden}label{font-weight:normal}label.control-label{font-weight:bold}::-webkit-input-placeholder{color:#bebebe !important}::-moz-placeholder{color:#bebebe !important}:-ms-input-placeholder{color:#bebebe !important}input:-moz-placeholder{color:#bebebe !important}.placeholder{padding:10px}input.placeholder,textarea.placeholder{padding:0 0 0 10px;color:#999}.help-block-error{font-size:12px}.hint-block,.help-block:not(.help-block-error){color:#aeaeae !important;font-size:12px}.hint-block:hover,.help-block:not(.help-block-error):hover{color:#7a7a7a !important;font-size:12px}.input-group-addon{border:none}a.input-field-addon{font-size:12px;float:right;margin-top:-10px}a.input-field-addon-sm{font-size:11px;float:right;margin-top:-10px}.timeZoneInputContainer{padding-top:10px}.timeZoneInputContainer~.help-block{margin:0px}.label{text-transform:uppercase}.label{text-transform:uppercase;display:inline-block;padding:3px 5px 4px;font-weight:600;font-size:10px !important;color:white !important;vertical-align:baseline;white-space:nowrap;text-shadow:none}.label-default{background:#ededed;color:#7a7a7a !important}a.label-default:hover{background:#e0e0e0 !important}.label-info{background-color:#6fdbe8}a.label-info:hover{background:#59d6e4 !important}.label-danger{background-color:#ff8989}a.label-danger:hover{background:#ff6f6f !important}.label-success{background-color:#97d271}a.label-success:hover{background:#89cc5e !important}.label-warning{background-color:#fdd198}a.label-warning:hover{background:#fdc67f !important}.regular-checkbox:checked+.regular-checkbox-box{border:2px solid #6fdbe8;background:#6fdbe8;color:white}.regular-checkbox-box.disabled{background:#d7d7d7 !important;border:2px solid #d7d7d7 !important;cursor:not-allowed}.regular-radio:checked+.regular-radio-button:after{background:#6fdbe8}.regular-radio:checked+.regular-radio-button{background-color:none;color:#99a1a7;border:2px solid #d7d7d7;margin-right:5px}.regular-radio.disabled{background:#d7d7d7 !important;border:2px solid #d7d7d7 !important;cursor:not-allowed}.errorMessage{color:#ff8989;padding:10px 0}.error{border-color:#ff8989 !important}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#ff8989 !important}.has-error .form-control,.has-error .form-control:focus{border-color:#ff8989;-webkit-box-shadow:none;box-shadow:none}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#97d271}.has-success .form-control,.has-success .form-control:focus{border-color:#97d271;-webkit-box-shadow:none;box-shadow:none}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#fdd198}.has-warning .form-control,.has-warning .form-control:focus{border-color:#fdd198;-webkit-box-shadow:none;box-shadow:none}.bootstrap-timepicker-widget .form-control{padding:0px}#notification_overview_filter label{display:block}#notification_overview_list .img-space{position:absolute;top:25px;left:25px}@media (max-width:767px){.notifications{position:inherit !important;float:left !important}.notifications .dropdown-menu{width:300px !important;margin-left:0 !important}.notifications .dropdown-menu .arrow{margin-left:-142px !important}}.badge-space{margin-top:6px}.badge-space-chooser{padding:3px 5px;margin-left:1px}.badge{padding:3px 5px;border-radius:2px;font-weight:normal;font-family:Arial,sans-serif;font-size:10px !important;text-transform:uppercase;color:#fff;vertical-align:baseline;white-space:nowrap;text-shadow:none;background-color:#d7d7d7;line-height:1}.popover{border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);-moz-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175)}.popover .popover-title{background:none;border-bottom:none;color:#555;font-weight:300;font-size:16px;padding:15px}.popover .popover-content{font-size:13px;padding:5px 15px;color:#555}.popover .popover-content a{color:#6fdbe8}.popover .popover-content img{max-width:100%}.popover .popover-navigation{padding:15px}.list-group-item{padding:6px 15px;border:none;border-width:0 !important;border-left:3px solid #fff !important;font-size:12px;font-weight:600}.list-group-item i{font-size:14px}a.list-group-item:hover,a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#555;background-color:#f7f7f7;border-left:3px solid #6fdbe8 !important}@media (max-width:991px){.list-group{margin-left:4px}.list-group-item{display:inline-block !important;border-radius:3px !important;margin:4px 0;margin-bottom:4px !important}.list-group-item{border:none !important}a.list-group-item:hover,a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{border:none !important;background:#708fa0 !important;color:#fff !important}}@media screen and (max-width:768px){.modal-dialog{width:auto !important;padding-top:30px;padding-bottom:30px}}.modal-top{z-index:999999 !important}.modal{overflow-y:visible}.modal-dialog-extra-small{width:400px}.modal-dialog-small{width:500px}.modal-dialog-normal{width:600px}.modal-dialog-medium{width:768px}.modal-dialog-large{width:900px}@media screen and (max-width:920px){.modal-dialog-large{width:auto !important;padding-top:30px;padding-bottom:30px}}.modal{border:none}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5{margin-top:20px;color:#555;font-weight:300}.modal h4.media-heading{margin-top:0}.modal-title{font-size:20px;font-weight:200;color:#555}.modal-dialog,.modal-content{min-width:150px}.modal-content{-webkit-border-radius:3px;-moz-border-radius:3px;box-shadow:0 2px 26px rgba(0,0,0,0.3),0 0 0 1px rgba(0,0,0,0.1);-webkit-box-shadow:0 2px 26px rgba(0,0,0,0.3),0 0 0 1px rgba(0,0,0,0.1);-moz-box-shadow:0 2px 26px rgba(0,0,0,0.3),0 0 0 1px rgba(0,0,0,0.1);border:none}.modal-content .modal-header{padding:20px 20px 0;border-bottom:none;text-align:center}.modal-content .modal-header .close{margin-top:2px;margin-right:5px}.modal-content .modal-body{padding:20px;font-size:13px}.modal-content .modal-footer{margin-top:0;text-align:left;padding:10px 20px 30px;border-top:none;text-align:center}.modal-content .modal-footer hr{margin-top:0}.modal-backdrop{background-color:rgba(0,0,0,0.5)}.modal-dialog.fadeIn,.modal-dialog.pulse{-webkit-animation-duration:200ms;-moz-animation-duration:200ms;animation-duration:200ms}.module-installed{opacity:0.5}.module-installed .label-success{background-color:#d7d7d7}.tooltip-inner{background-color:#708fa0;max-width:400px;text-align:left;font-weight:300;padding:2px 8px 4px;font-weight:bold;white-space:pre-wrap}.tooltip.top .tooltip-arrow{border-top-color:#708fa0}.tooltip.top-left .tooltip-arrow{border-top-color:#708fa0}.tooltip.top-right .tooltip-arrow{border-top-color:#708fa0}.tooltip.right .tooltip-arrow{border-right-color:#708fa0}.tooltip.left .tooltip-arrow{border-left-color:#708fa0}.tooltip.bottom .tooltip-arrow{border-bottom-color:#708fa0}.tooltip.bottom-left .tooltip-arrow{border-bottom-color:#708fa0}.tooltip.bottom-right .tooltip-arrow{border-bottom-color:#708fa0}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.progress{height:10px;margin-bottom:15px;box-shadow:none;background:#ededed;border-radius:10px}.progress-bar-info{background-color:#6fdbe8;-webkit-box-shadow:none;box-shadow:none}#nprogress .bar{height:2px;background:#6fdbe8}table{margin-bottom:0px !important}table th{font-size:11px;color:#bebebe;font-weight:normal}table thead tr th{border:none !important}table .time{font-size:12px}table td a:hover{color:#6fdbe8}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:10px 10px 10px 0}.table>thead>tr>th select,.table>tbody>tr>th select,.table>tfoot>tr>th select,.table>thead>tr>td select,.table>tbody>tr>td select,.table>tfoot>tr>td select{font-size:12px;padding:4px 8px;height:30px;margin:0}.table-middle>thead>tr>th,.table-middle>tbody>tr>th,.table-middle>tfoot>tr>th,.table-middle>thead>tr>td,.table-middle>tbody>tr>td,.table-middle>tfoot>tr>td{vertical-align:middle !important}.comment-container{margin-top:10px}.comment-container .wall-entry-controls{margin-left:50px}.comment .media{position:relative !important;margin-top:0}.comment .media .nav-pills.preferences{display:none;right:-3px;top:-3px}.comment .media-body{overflow:visible}.comment .jp-progress{background-color:#dbdcdd !important}.comment .jp-play-bar{background:#cacaca}.comment .content a{color:#21bdd0}.comment.guest-mode .media:last-child .wall-entry-controls{margin-bottom:0;margin-left:50px}.comment.guest-mode .media:last-child hr{display:none}.comment_create,.content_edit{position:relative}.comment_create .comment-buttons,.content_edit .comment-buttons{position:absolute;bottom:2px;right:5px}.comment_create .btn-comment-submit,.content_edit .btn-comment-submit{margin-top:3px}.comment_create .fileinput-button,.content_edit .fileinput-button{float:left;padding:6px 10px;background:transparent !important}.comment_create .fileinput-button .fa,.content_edit .fileinput-button .fa{color:#d7d7d7}.comment_create .fileinput-button:hover .fa,.content_edit .fileinput-button:hover .fa{background:transparent !important;color:#b2b2b2}.comment_create .fileinput-button:active,.content_edit .fileinput-button:active{box-shadow:none !important}.post-richtext-input-group{position:relative}.post-richtext-input-group .comment-buttons{bottom:7px !important}.comment-container .content_edit{margin-left:50px}.comment_edit_content{margin-left:50px}.comment-message{overflow:hidden;overflow-wrap:break-word}.comment-create-input-group{position:relative}.comment-create-input-group .ProsemirrorEditor .ProseMirror{padding-right:72px}.comment-create-input-group.scrollActive .comment-buttons{right:22px}.grid-view img{width:24px;height:24px}.grid-view .filters input,.grid-view .filters select{border:2px solid #ededed;box-shadow:none;min-height:35px;border-radius:4px;font-size:12px;padding:4px}.grid-view .filters input:focus,.grid-view .filters select:focus{border:2px solid #6fdbe8;outline:0;box-shadow:none}.grid-view{padding:15px 0 0}.grid-view img{border-radius:3px}.grid-view table th{font-size:13px !important;font-weight:bold !important}.grid-view table td{vertical-align:middle !important}.grid-view table tr{font-size:13px !important}.grid-view table thead tr th:first-of-type{padding-left:5px}.grid-view table tbody tr{height:50px}.grid-view table tbody tr td:first-of-type{padding-left:5px}.grid-view .summary{font-size:12px;color:#bac2c7}.permission-grid-editor>.table>tbody>tr:first-child>td{border:none}.permission-grid-editor{padding-top:0px}.detail-view td,.detail-view th{padding:8px !important}.detail-view th{font-size:13px}.oembed_snippet{margin-top:10px;position:relative;padding-bottom:55%;padding-top:15px;height:0;overflow:hidden}.oembed_snippet iframe{position:absolute;top:0;left:0;width:100%;height:100%}.activities{max-height:400px;overflow:auto}.activities li .media{position:relative}.activities li .media .img-space{position:absolute;top:14px;left:14px}.activities li .media .media-body{max-width:295px}.contentForm_options{margin-top:10px;min-height:29px}.contentForm_options .btn_container{position:relative}.contentForm_options .btn_container .label-public{position:absolute;right:40px;top:11px}#content-topic-bar{margin-top:5px;text-align:right}#content-topic-bar .label{margin-left:4px}#contentFormError{color:#ff8989;padding-left:0;list-style:none}.placeholder-empty-stream{background-image:url("../img/placeholder-postform-arrow.png");background-repeat:no-repeat;padding:37px 0 0 70px;margin-left:90px}.wall-entry{position:relative}.wall-entry .content p,.wall-entry .content a{overflow:hidden;text-overflow:ellipsis;max-width:100%}.wall-entry .content img{max-width:100%}.wall-entry .media{overflow:visible}.wall-entry .well{margin-bottom:0}.wall-entry .well .comment .show-all-link{font-size:12px;cursor:pointer}.wall-entry .media-heading{font-size:14px;padding-top:1px;margin-bottom:3px}.wall-entry .media-heading .labels{padding-right:32px}.wall-entry .media-heading .viaLink{font-size:13px}.wall-entry .media-heading .viaLink i{color:#bebebe;padding-left:4px;padding-right:4px}.wall-entry .media-subheading{color:#bebebe;font-size:12px}.wall-entry .media-subheading .time{font-size:12px;white-space:nowrap}.wall-entry-controls,.wall-entry-controls a{font-size:11px;font-weight:700;color:#7a7a7a;margin-top:10px;margin-bottom:0}#wall-stream-filter-nav{font-size:12px;margin-bottom:10px;padding-top:2px;border-radius:0 0 4px 4px}#wall-stream-filter-nav .wall-stream-filter-root{margin:0;border:0 !important}#wall-stream-filter-nav .filter-panel{padding:0 10px}#wall-stream-filter-nav .wall-stream-filter-head{padding:5px 5px 10px 5px;border-bottom:1px solid #ddd}#wall-stream-filter-nav .wall-stream-filter-body{overflow:hidden;background-color:#f7f7f7;border:1px solid #ddd;border-top:0;border-radius:0 0 4px 4px}#wall-stream-filter-nav hr{margin:5px 0 0 0}#wall-stream-filter-nav .topic-remove-label{float:left}#wall-stream-filter-nav .topic-remove-label,#wall-stream-filter-nav .content-type-remove-label{margin-right:6px}#wall-stream-filter-nav .select2{width:260px !important;margin-bottom:5px;margin-top:2px}#wall-stream-filter-nav .select2 .select2-search__field{height:25px !important}#wall-stream-filter-nav .select2 .select2-selection__choice{height:23px !important}#wall-stream-filter-nav .select2 .select2-selection__choice span,#wall-stream-filter-nav .select2 .select2-selection__choice i{line-height:19px !important}#wall-stream-filter-nav .select2 .select2-selection__choice .img-rounded{width:18px !important;height:18px !important}#wall-stream-filter-nav .wall-stream-filter-bar{display:inline;float:right;white-space:normal}#wall-stream-filter-nav .wall-stream-filter-bar .label{height:18px;padding-top:4px}#wall-stream-filter-nav .wall-stream-filter-bar .btn,#wall-stream-filter-nav .wall-stream-filter-bar .label{box-shadow:0 0 2px #7a7a7a;-webkit-box-shadow:0 0 2px #7a7a7a;-moz-box-shadow:0 0 2px #7a7a7a}@media (max-width:767px){#wall-stream-filter-nav .wall-stream-filter-root{white-space:nowrap}#wall-stream-filter-nav .wall-stream-filter-body{overflow:auto}}.filter-root{margin:15px}.filter-root .row{display:table !important}.filter-root .filter-panel{padding:0 5px;display:table-cell !important;float:none}.filter-root .filter-panel .filter-block strong{margin-bottom:5px}.filter-root .filter-panel .filter-block ul.filter-list{list-style:none;padding:0;margin:0 0 5px}.filter-root .filter-panel .filter-block ul.filter-list li{font-size:12px;padding:2px}.filter-root .filter-panel .filter-block ul.filter-list li a{color:#555}.filter-root .filter-panel div.filter-block:last-of-type ul.filter-list{margin:0px}.filter-root .filter-panel+.filter-panel{border-left:2px solid #ededed}.stream-entry-loader{float:right;margin-top:5px}.load-suppressed{margin-top:-17px;margin-bottom:15px;text-align:center}.load-suppressed a{display:inline-block;background-color:white;padding:5px;border-radius:0 0 4px 4px;border:1px solid #ddd;font-size:11px}.space-owner{text-align:center;margin:14px 0;font-size:13px;color:#999}.space-member-sign{color:#97d271;position:absolute;top:42px;left:42px;font-size:16px;background:#fff;width:24px;height:24px;padding:2px 3px 1px 4px;border-radius:50px;border:2px solid #97d271}#space-menu-dropdown i.type{font-size:16px;color:#BFBFBF}#space-menu-spaces [data-space-chooser-item]{cursor:pointer}#space-menu-dropdown .input-group-addon{border-radius:0px 4px 4px 0px}#space-menu-dropdown .input-group-addon.focus{border-radius:0px 4px 4px 0px;border:2px solid #6fdbe8;border-left:0px}#space-menu-search{border-right:0px}#space-directory-link i{margin-right:0px}.space-acronym{color:#fff;text-align:center;display:inline-block}.current-space-image{margin-right:3px;margin-top:3px}@media (max-width:767px){#space-menu>.title{display:none}#space-menu-dropdown{width:300px !important}}.files,#postFormFiles_list{padding-left:0}.contentForm-upload-list{padding-left:0}.contentForm-upload-list li:first-child{margin-top:10px}.file_upload_remove_link,.file_upload_remove_link:hover{color:#ff8989;cursor:pointer}.file-preview-item{text-overflow:ellipsis;overflow:hidden}.post-files{margin-top:10px}.post-files img{vertical-align:top;margin-bottom:3px;margin-right:5px;max-height:100%;-webkit-animation-duration:2s;animation-duration:2s}#wallStream.mobile .post-files{margin-top:10px;display:flex;overflow-x:auto}#wallStream.mobile .post-files img{max-width:190px}.file-preview-content{cursor:pointer}.image-upload-container{position:relative}.image-upload-container .image-upload-buttons{display:none;position:absolute;right:5px;bottom:5px}.image-upload-container input[type="file"]{position:absolute;opacity:0}.image-upload-container .image-upload-loader{display:none;position:absolute;top:0;left:0;width:100%;height:100%;padding:20px;background:#f8f8f8}.mime{background-repeat:no-repeat;background-position:0 0;padding:1px 0 4px 26px}.mime-word{background-image:url("../img/mime/word.png")}.mime-excel{background-image:url("../img/mime/excel.png")}.mime-powerpoint{background-image:url("../img/mime/powerpoint.png")}.mime-pdf{background-image:url("../img/mime/pdf.png")}.mime-zip{background-image:url("../img/mime/zip.png")}.mime-image{background-image:url("../img/mime/image.png")}.mime-file{background-image:url("../img/mime/file.png")}.mime-photoshop{background-image:url("../img/mime/photoshop.png")}.mime-illustrator{background-image:url("../img/mime/illustrator.png")}.mime-video{background-image:url("../img/mime/video.png")}.mime-audio{background-image:url("../img/mime/audio.png")}ul.tour-list{list-style:none;margin-bottom:0;padding-left:10px}ul.tour-list li{padding-top:5px}ul.tour-list li a{color:#6fdbe8}ul.tour-list li a .fa{width:16px}ul.tour-list li.completed a{text-decoration:line-through;color:#bebebe}.atwho-view{position:absolute;top:0;left:0;display:none;margin-top:18px;background:white;color:#555555;font-size:14px;font-weight:400;border:1px solid #d7d7d7;border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);min-width:120px;max-width:265px;z-index:11110 !important;padding:5px 0}.atwho-view strong,.atwho-view b{font-weight:normal}.atwho-view ul li.hint{background:#fff !important;border-left:3px solid transparent !important;font-size:12px;color:#999}.atwho-view .cur small{color:red}.atwho-view strong{background-color:#f9f0d2}.atwho-view .cur strong{background-color:#f9f0d2}.atwho-view ul{list-style:none;padding:0;margin:auto}.atwho-view ul li{display:block;padding:5px 10px;border-left:3px solid transparent;padding:4px 15px 4px 8px;cursor:pointer}.atwho-view small{font-size:smaller;color:#777;font-weight:normal}.atwho-input.form-control{min-height:36px;height:auto;padding-right:95px;word-wrap:break-word}.atwho-input p{padding:0;margin:0}.atwho-placeholder{color:#bebebe !important}.atwho-emoji-entry{float:left;padding:4px !important;margin:0px !important;border:none !important}.atwho-emoji-entry:hover,.atwho-emoji-entry:active,.atwho-emoji-entry:focus{padding:4px !important;margin:0px !important;border:none !important;background-color:#f7f7f7 !important;border-radius:3px}.atwho-view .cur{border-left:3px solid #6fdbe8;background-color:#f7f7f7 !important}.atwho-user,.atwho-space,.atwho-input a{color:#6fdbe8}.atwho-input a:hover{color:#6fdbe8}.atwho-view strong{background-color:#f9f0d2}.atwho-view .cur strong{background-color:#f9f0d2}.atwho-view span{padding:5px}.sk-spinner-three-bounce.sk-spinner{margin:0 auto;width:70px;text-align:center}.loader{padding:30px 0}.loader .sk-spinner-three-bounce div,.loader .sk-spinner-three-bounce span{width:12px;height:12px;background-color:#6fdbe8;border-radius:100%;display:inline-block;-webkit-animation:sk-threeBounceDelay 1.4s infinite ease-in-out;animation:sk-threeBounceDelay 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.loader .sk-spinner-three-bounce .sk-bounce1{-webkit-animation-delay:-0.32s;animation-delay:-0.32s}.loader .sk-spinner-three-bounce .sk-bounce2{-webkit-animation-delay:-0.16s;animation-delay:-0.16s}@-webkit-keyframes sk-threeBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-threeBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.loader-modal{padding:8px 0}.loader-postform{padding:9px 0}.loader-postform .sk-spinner-three-bounce.sk-spinner{text-align:left;margin:0}.markdown-render h1,.markdown-render h2,.markdown-render h3,.markdown-render h4,.markdown-render h5,.markdown-render h6{font-weight:bold !important}.markdown-render h1{font-size:28px !important}.markdown-render h2{font-size:24px !important}.markdown-render h3{font-size:18px !important}.markdown-render h4{font-size:16px !important}.markdown-render h5{font-size:14px !important}.markdown-render h6{color:#999;font-size:14px !important}.markdown-render pre{padding:0;border:none;border-radius:3px}.markdown-render pre code{padding:10px;border-radius:3px;font-size:12px !important}.markdown-render a,.markdown-render a:visited{background-color:inherit;text-decoration:none;color:#6fdbe8 !important}.markdown-render a.header-anchor{color:#777 !important}.markdown-render img{max-width:100%}.markdown-render table{width:100%}.markdown-render table th{font-size:13px;font-weight:700;color:#555}.markdown-render table thead tr{border-bottom:1px solid #d7d7d7}.markdown-render table tbody tr td,.markdown-render table thead tr th{border:1px solid #d7d7d7 !important;padding:4px}.md-editor.active{border:2px solid #6fdbe8 !important}.md-editor textarea{padding:10px !important}[data-ui-markdown],[data-ui-richtext]{overflow:hidden;overflow-wrap:break-word}[data-ui-markdown] h1,[data-ui-richtext] h1,[data-ui-markdown] h2,[data-ui-richtext] h2,[data-ui-markdown] h3,[data-ui-richtext] h3,[data-ui-markdown] h4,[data-ui-richtext] h4,[data-ui-markdown] h5,[data-ui-richtext] h5,[data-ui-markdown] h6,[data-ui-richtext] h6{text-align:start;margin:0 0 0.5em}[data-ui-markdown] h1,[data-ui-richtext] h1{font-size:1.7em !important;font-weight:600}[data-ui-markdown] h2,[data-ui-richtext] h2{font-size:1.5em !important;font-weight:500}[data-ui-markdown] h3,[data-ui-richtext] h3{font-size:1.2em !important}[data-ui-markdown] h4,[data-ui-richtext] h4{font-size:1.1em !important}[data-ui-markdown] h5,[data-ui-richtext] h5{font-size:1em !important}[data-ui-markdown] h6,[data-ui-richtext] h6{font-size:.85em !important}[data-ui-markdown] p,[data-ui-richtext] p,[data-ui-markdown] pre,[data-ui-richtext] pre,[data-ui-markdown] blockquote,[data-ui-richtext] blockquote{margin:0 0 1.1em}[data-ui-markdown] p:last-child,[data-ui-richtext] p:last-child{margin:0}[data-ui-markdown] pre code.hljs,[data-ui-richtext] pre code.hljs{background-color:#f5f5f5}[data-ui-markdown] blockquote,[data-ui-richtext] blockquote{border-left-width:10px;background-color:rgba(128,128,128,0.05);border-top-right-radius:5px;border-bottom-right-radius:5px;padding:15px 20px;font-size:1em;border-left:5px solid #888888}[data-ui-markdown] table,[data-ui-richtext] table{width:100%}[data-ui-markdown] table th,[data-ui-richtext] table th{font-size:13px;font-weight:700;color:#555;background-color:#f7f7f7}[data-ui-markdown] table td,[data-ui-richtext] table td,[data-ui-markdown] table th,[data-ui-richtext] table th{border:1px solid #d7d7d7 !important;padding:6px}[data-ui-markdown] dt,[data-ui-richtext] dt,[data-ui-markdown] dd,[data-ui-richtext] dd{margin-top:5px;margin-bottom:5px;line-height:1.45}[data-ui-markdown] dt,[data-ui-richtext] dt{font-weight:bold}[data-ui-markdown] dd,[data-ui-richtext] dd{margin-left:40px}[data-ui-markdown] pre,[data-ui-richtext] pre{text-align:start;border:0;padding:10px 20px;border-radius:5px}[data-ui-markdown] pre code,[data-ui-richtext] pre code{white-space:pre !important}[data-ui-markdown] blockquote ul:last-child,[data-ui-richtext] blockquote ul:last-child,[data-ui-markdown] blockquote ol:last-child,[data-ui-richtext] blockquote ol:last-child{margin-bottom:0px}[data-ui-markdown] ul,[data-ui-richtext] ul,[data-ui-markdown] ol,[data-ui-richtext] ol{margin-top:0;margin-bottom:10.5px}[data-ui-markdown] ul li p,[data-ui-richtext] ul li p,[data-ui-markdown] ol li p,[data-ui-richtext] ol li p{overflow:visible !important}[data-ui-markdown] .footnote,[data-ui-richtext] .footnote{vertical-align:top;position:relative;top:-0.5em;font-size:.8em}[data-ui-markdown] .emoji,[data-ui-richtext] .emoji{width:16px}[data-ui-markdown] a.not-found,[data-ui-richtext] a.not-found{color:#fdd198}[data-ui-markdown] li,[data-ui-richtext] li{border:0 !important;background-color:transparent !important;padding:0}[data-ui-markdown] img,[data-ui-richtext] img{max-width:100%}blockquote{border-left:2px dotted #888;padding-left:5px;background:#d0f0ff}.wmd-panel{min-width:500px}.wmd-button-bar{width:100%;background-color:Silver}.wmd-input{height:300px;width:100%;background-color:Gainsboro;border:1px solid DarkGray}.wmd-button-row{position:relative;margin-left:5px;margin-right:5px;margin-bottom:5px;margin-top:10px;padding:0px;height:20px}.wmd-spacer{width:1px;height:20px;margin-left:14px;position:absolute;background-color:Silver;display:inline-block;list-style:none}.wmd-button{width:20px;height:20px;padding-left:2px;padding-right:3px;position:absolute;display:inline-block;list-style:none;cursor:pointer}.wmd-button>span{background-image:url(../img/wmd-buttons.png);background-repeat:no-repeat;background-position:0px 0px;width:20px;height:20px;display:inline-block}.wmd-spacer1{left:50px}.wmd-spacer2{left:175px}.wmd-spacer3{left:300px}.wmd-prompt-background{background-color:Black}.wmd-prompt-dialog{border:1px solid #999999;background-color:#F5F5F5}.wmd-prompt-dialog>div{font-size:0.8em;font-family:arial,helvetica,sans-serif}.wmd-prompt-dialog>form>input[type="text"]{border:1px solid #999999;color:black}.wmd-prompt-dialog>form>input[type="button"]{border:1px solid #888888;font-family:trebuchet MS,helvetica,sans-serif;font-size:0.8em;font-weight:bold}@media (max-width:991px){.layout-sidebar-container{display:none}}.ui-widget-header{border:none !important;background:#fff !important;color:#7a7a7a !important;font-weight:300 !important}.ui-widget-content{border:1px solid #dddcda !important;border-radius:0 !important;background:#fff;color:#555 !important;-webkit-box-shadow:0 6px 6px rgba(0,0,0,0.1);box-shadow:0 6px 6px rgba(0,0,0,0.1)}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{opacity:0.2}.ui-datepicker .ui-datepicker-prev:hover,.ui-datepicker .ui-datepicker-next:hover{background:#fff !important;border:none;margin:1px}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:none !important;background:#f7f7f7 !important;color:#7a7a7a !important}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:none !important;border:1px solid #b2b2b2 !important}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #6fdbe8 !important;background:#ddf6fa !important}.status-bar-body{color:white;position:fixed;width:100%;background-color:rgba(0,0,0,0.7);text-align:center;padding:20px;z-index:9999999;bottom:0px;display:block;line-height:20px}.status-bar-close{color:white;fonfont-weight:bold;font-size:21px;cursor:pointer}.status-bar-close:hover{color:white}.status-bar-close i{vertical-align:top !important;padding-top:3px}.status-bar-content i{margin-right:10px;font-size:21px;vertical-align:middle}.status-bar-content .showMore{color:#6fdbe8;float:right;margin-left:10px;font-size:0.7em;cursor:pointer;vertical-align:middle;white-space:nowrap}.status-bar-content .status-bar-details{text-align:left;font-size:0.7em;margin-top:20px;max-height:200px;overflow:auto}.status-bar-content span{vertical-align:middle}.status-bar-content i.error,.status-bar-content i.fatal{color:#ff8989}.status-bar-content i.warning{color:#fdd198}.status-bar-content i.info,.status-bar-content i.debug{color:#6fdbe8}.status-bar-content i.success{color:#85CA2B}.highlight{background-color:#fff8e0}.alert-default{color:#555;background-color:#f7f7f7;border-color:#ededed;font-size:13px}.alert-default .info{margin:10px 0}.alert-success{color:#84be5e;background-color:#f7fbf4;border-color:#97d271}.alert-warning{color:#e9b168;background-color:#fffbf7;border-color:#fdd198}.alert-danger{color:#ff8989;background-color:#fff6f6;border-color:#ff8989}.data-saved{padding-left:10px;color:#6fdbe8}img.bounceIn{-webkit-animation-duration:800ms;-moz-animation-duration:800ms;animation-duration:800ms}.tags .tag{margin-top:5px;border-radius:2px;padding:4px 8px;text-transform:uppercase;max-width:150px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ProsemirrorEditor.fullscreen{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9998}.ProsemirrorEditor.fullscreen .ProseMirror-menubar-wrapper{height:100%}.ProsemirrorEditor.fullscreen .humhub-ui-richtext{max-height:none !important}.ProsemirrorEditor.fullscreen .ProseMirror{position:static;overflow:auto;heigh:100%;height:calc(100% - 26px);height:-o-calc(100% - 26px);height:-webkit-calc(100% - 26px)}.ProsemirrorEditor.fullscreen .ProseMirror-menubar{position:static !important;top:0 !important;left:0 !important;margin:0 !important;width:100% !important}.ProsemirrorEditor .ProseMirror{padding-right:12px}.ProsemirrorEditor .ProseMirror-menu{margin:0 -4px;line-height:1}.ProsemirrorEditor .ProseMirror-tooltip .ProseMirror-menu{width:-webkit-fit-content;width:fit-content;white-space:pre}.ProsemirrorEditor .ProseMirror-menuitem{margin-right:0;display:inline-block}.ProsemirrorEditor .ProseMirror-menuseparator{border-right:1px solid #ddd;margin-right:3px}.ProsemirrorEditor .ProseMirror-menuitem .ProseMirror-menu-group{border-right:1px solid #ddd}.ProsemirrorEditor .ProseMirror-menuitem .ProseMirror-menu-group.last{border-right:none}.ProsemirrorEditor .ProseMirror-menuitem .seperator{border-right:1px solid #ddd;margin-right:2px;padding-right:2px}.ProsemirrorEditor .ProseMirror-menu-dropdown,.ProsemirrorEditor .ProseMirror-menu-dropdown-menu{font-size:90%;white-space:nowrap}.ProsemirrorEditor .ProseMirror-menu-dropdown{cursor:pointer;position:relative;padding-right:15px !important}.ProsemirrorEditor .ProseMirror-menu-dropdown-wrap{padding:1px 0 1px 0;display:inline-block;position:relative}.ProsemirrorEditor .ProseMirror-menu-dropdown-right{right:0}.ProsemirrorEditor .ProseMirror-menu-dropdown:after{content:"";border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid currentColor;opacity:.6;position:absolute;right:4px;top:calc(50% - 2px)}.ProsemirrorEditor .ProseMirror-menu-submenu{border-top-right-radius:4px}.ProsemirrorEditor .ProseMirror-menu-dropdown-menu,.ProsemirrorEditor .ProseMirror-menu-submenu{position:absolute;background:white;color:#666;border:1px solid #aaa;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.ProsemirrorEditor .ProseMirror-menu-dropdown-menu{z-index:15;min-width:6em;margin-top:2px}.ProsemirrorEditor .ProseMirror-menu-dropdown-item{cursor:pointer}.ProsemirrorEditor .ProseMirror-menu-dropdown-item div[title],.ProsemirrorEditor .ProseMirror-menu-submenu-wrap{padding:4px}.ProsemirrorEditor .ProseMirror-menu-dropdown-item:hover{background:#f2f2f2}.ProsemirrorEditor .ProseMirror-menu-submenu-wrap{position:relative}.ProsemirrorEditor .ProseMirror-menu-submenu-label:after{content:"";border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:4px solid currentColor;opacity:.6;position:absolute;right:4px;top:calc(50% - 4px)}.ProsemirrorEditor .ProseMirror-menu-submenu{display:none;min-width:4em;left:100%;top:0}.ProsemirrorEditor .ProseMirror-menu-active{background:#eee;border-radius:4px;border:1px solid #ededed !important}.ProsemirrorEditor .ProseMirror-menu-disabled{opacity:.3}.ProsemirrorEditor .ProseMirror-menu-submenu-wrap:hover .ProseMirror-menu-submenu,.ProsemirrorEditor .ProseMirror-menu-submenu-wrap-active .ProseMirror-menu-submenu{display:block}.ProsemirrorEditor .ProseMirror-icon{display:inline-block;line-height:.8;vertical-align:-2px;padding:1px 7px;cursor:pointer;border:1px solid transparent}.ProsemirrorEditor .ProseMirror-menu-disabled.ProseMirror-icon{cursor:default}.ProsemirrorEditor .ProseMirror-icon svg{fill:currentColor;height:1em}.ProsemirrorEditor .ProseMirror-icon span{vertical-align:text-top}.ProsemirrorEditor.plainMenu .ProseMirror{border-top-left-radius:0 !important;border-top-right-radius:0 !important;border-top-width:1px !important}.ProsemirrorEditor.plainMenu .ProseMirror-menu-group{padding:5px}.ProsemirrorEditor.plainMenu .ProseMirror-menuitem .ProseMirror-menu-group{padding:2px}.ProsemirrorEditor.plainMenu .ProseMirror-menubar~.ProseMirror-focused{border-color:#6fdbe8 !important}.ProsemirrorEditor.plainMenu .ProseMirror-textblock-dropdown{min-width:3em}.ProsemirrorEditor.plainMenu .ProseMirror-menubar-wrapper{z-index:8}.ProsemirrorEditor.plainMenu .ProseMirror-menubar{background-color:#f7f7f7;border-top-left-radius:4px;border-top-right-radius:4px;border:1px solid #ddd;position:relative;min-height:1em;color:#666;padding:1px 6px 1px 0;top:0;left:0;right:0;z-index:10;-moz-box-sizing:border-box;box-sizing:border-box;overflow:visible}.ProsemirrorEditor.focusMenu .form-control:focus{border-top-left-radius:0 !important}.ProsemirrorEditor.focusMenu .ProseMirror-menubar{display:table;min-height:1em;color:#666;padding:2px 6px;top:0;left:0;right:0;z-index:10;-moz-box-sizing:border-box;box-sizing:border-box;overflow:visible;margin-top:-26px;background:white;border:1px solid #d7d7d7;border-bottom:0;border-top:2px solid #d7d7d7;border-top-left-radius:4px;border-top-right-radius:4px;float:left}@-moz-document url-prefix(){.ProsemirrorEditor.focusMenu .ProseMirror-menubar{margin-top:-27px}}.ProsemirrorEditor .ProseMirror{position:relative;word-wrap:break-word;white-space:pre-wrap;-webkit-font-variant-ligatures:none;font-variant-ligatures:none}.ProsemirrorEditor .ProseMirror ul,.ProsemirrorEditor .ProseMirror ol{cursor:default}.ProsemirrorEditor .ProseMirror pre{white-space:pre-wrap}.ProsemirrorEditor .ProseMirror li{position:relative}.ProsemirrorEditor .ProseMirror img{max-width:100%}.ProsemirrorEditor .ProseMirror-hideselection *::selection{background:transparent}.ProsemirrorEditor .ProseMirror-hideselection *::-moz-selection{background:transparent}.ProsemirrorEditor .ProseMirror-selectednode{outline:2px dashed #8cf}.ProsemirrorEditor li.ProseMirror-selectednode{outline:none}.ProsemirrorEditor li.ProseMirror-selectednode:after{content:"";position:absolute;left:-32px;right:-2px;top:-2px;bottom:-2px;border:2px solid #8cf;pointer-events:none}.ProsemirrorEditor .ProseMirror-textblock-dropdown{min-width:3em}.ProsemirrorEditor .ProseMirror-menu{margin:0 -4px;line-height:1}.ProsemirrorEditor .ProseMirror-tooltip .ProseMirror-menu{width:-webkit-fit-content;width:fit-content;white-space:pre}.ProsemirrorEditor .ProseMirror-gapcursor{display:none;pointer-events:none;position:absolute}.ProsemirrorEditor .ProseMirror-gapcursor:after{content:"";display:block;position:absolute;top:-2px;width:20px;border-top:1px solid black;animation:ProseMirror-cursor-blink 1.1s steps(2, start) infinite}@keyframes ProseMirror-cursor-blink{to{visibility:hidden}}.ProsemirrorEditor .ProseMirror-focused .ProseMirror-gapcursor{display:block}.ProsemirrorEditor .ProseMirror-example-setup-style hr{padding:2px 10px;border:none;margin:1em 0}.ProsemirrorEditor .ProseMirror-example-setup-style hr:after{content:"";display:block;height:1px;background-color:silver;line-height:2px}.ProsemirrorEditor .ProseMirror ul,.ProsemirrorEditor .ProseMirror ol{padding-left:30px}.ProsemirrorEditor .ProseMirror blockquote{padding-left:1em;border-left:3px solid #eee;margin-left:0;margin-right:0}.ProsemirrorEditor .ProseMirror-example-setup-style img{cursor:default}.ProsemirrorEditor .ProseMirror p{margin-top:1em}.ProsemirrorEditor .ProseMirror p:first-child{margin:0px}.ProsemirrorEditor .ProseMirror p:first-child+*{margin-top:1em}.ProsemirrorEditor .ProsemirrorEditor{position:relative}.ProsemirrorEditor .ProsemirrorEditor .ProseMirror{padding-right:12px !important}.ProsemirrorEditor .ProsemirrorEditor img{max-width:100%}.ProsemirrorEditor .ProseMirror h1:first-child,.ProsemirrorEditor .ProseMirror h2:first-child,.ProsemirrorEditor .ProseMirror h3:first-child,.ProsemirrorEditor .ProseMirror h4:first-child,.ProsemirrorEditor .ProseMirror h5:first-child,.ProsemirrorEditor .ProseMirror h6:first-child{margin-top:10px}.ProsemirrorEditor .ProseMirror [data-mention]{color:#6fdbe8}.ProsemirrorEditor .ProseMirror{outline:none}.ProsemirrorEditor .ProseMirror [data-oembed]{font-size:0}.ProsemirrorEditor .ProseMirror iframe{pointer-events:none;display:block}.ProsemirrorEditor .ProseMirror p{margin-bottom:1em}.ProsemirrorEditor .ProseMirror-textblock-dropdown{min-width:3em}.ProsemirrorEditor .ProseMirror .placeholder{padding:0px !important;pointer-events:none;height:0}.ProsemirrorEditor .ProseMirror:focus .placeholder{display:none}.ProsemirrorEditor .ProseMirror .tableWrapper{overflow-x:auto}.ProsemirrorEditor .ProseMirror .column-resize-handle{position:absolute;right:-2px;top:0;bottom:0;width:4px;z-index:20;background-color:#adf;pointer-events:none}.ProsemirrorEditor .ProseMirror.resize-cursor{cursor:ew-resize;cursor:col-resize}.ProsemirrorEditor .ProseMirror .selectedCell:after{z-index:2;position:absolute;content:"";left:0;right:0;top:0;bottom:0;background:rgba(200,200,255,0.4);pointer-events:none}.ProsemirrorEditor .ProseMirror-menubar-wrapper{position:relative;outline:none}.ProsemirrorEditor .ProseMirror table{margin:0}.ProsemirrorEditor .ProseMirror .tableWrapper{margin:1em 0}.ProseMirror-prompt{background:white;padding:5px 10px 5px 15px;border:1px solid silver;position:fixed;border-radius:3px;min-width:300px;z-index:999999;box-shadow:-0.5px 2px 5px rgba(0,0,0,0.2)}.ProseMirror-prompt h5{font-weight:bold;font-size:100%;margin:15px 0}.ProseMirror-prompt input{margin-bottom:5px}.ProseMirror-prompt-close{position:absolute;left:2px;top:1px;color:#666;border:none;background:transparent;padding:0}.ProseMirror-prompt-close:after{content:"✕";font-size:12px}.ProseMirror-invalid{background:#ffc;border:1px solid #cc7;border-radius:4px;padding:5px 10px;position:absolute;min-width:10em}.ProseMirror-prompt-buttons{margin:15px 0;text-align:center}.atwho-view .cur{border-left:3px solid #59d6e4;background-color:#f7f7f7 !important}.atwho-user,.atwho-space,.atwho-input a{color:#59d6e4}.atwho-input a:hover{color:#59d6e4}.atwho-view strong{background-color:#f9f0d2}.atwho-view .cur strong{background-color:#f9f0d2}[data-emoji-category]{max-height:200px;display:block;position:relative;overflow:auto}[data-emoji-category] .atwho-emoji-entry{width:24px;height:28px;overflow:hidden}[data-emoji-category] .atwho-emoji-entry.cur{background-color:#ededed !important}.emoji-nav{padding-top:10px}.emoji-nav .emoji-nav-item{border-top:2px solid #fff8e0}.emoji-nav .emoji-nav-item.cur{border-left:0px;border-top:2px solid #6fdbe8}@media screen and (max-width:768px){.ProsemirrorEditor.focusMenu .ProseMirror-menubar{min-height:1em}}.icon-sm,.fa-sm{font-size:.875em}.icon-lg,.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-0.0667em}.icon-2x,.fa-2x{font-size:2em}.icon-3x,.fa-3x{font-size:3em}.icon-4x,.fa-4x{font-size:4em}.icon-5x,.fa-5x{font-size:5em}.icon-6x,.fa-6x{font-size:6em}.icon-7x,.fa-7x{font-size:7em}.icon-9x,.fa-9x{font-size:9em}.icon-10x,.fa-10x{font-size:10em}/*! Select2 humhub Theme v0.1.0-beta.4 | MIT License | github.com/select2/select2-humhub-theme */.select2-container--humhub{display:block}.select2-container--humhub .select2-selection{background-color:#fff;border:2px solid #ededed;border-radius:4px;color:#555;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;outline:0}.select2-container--humhub .select2-search--dropdown .select2-search__field{background-color:#fff;border:2px solid #ededed;border-radius:4px;color:#555;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px}.select2-container--humhub .select2-search__field{outline:0}.select2-container--humhub .select2-search__field::-webkit-input-placeholder{color:#999}.select2-container--humhub .select2-search__field:-moz-placeholder{color:#999}.select2-container--humhub .select2-search__field::-moz-placeholder{color:#999;opacity:1}.select2-container--humhub .select2-search__field:-ms-input-placeholder{color:#999}.select2-container--humhub .select2-results__option[role=group]{padding:0}.select2-container--humhub .select2-results__option[aria-disabled=true]{color:#777;cursor:not-allowed}.select2-container--humhub .select2-results__option[aria-selected=true]{background-color:#f5f5f5;color:#262626;border-left:3px solid transparent}.select2-container--humhub .select2-results__option[aria-selected=false]{border-left:3px solid transparent}.select2-container--humhub .select2-results__option--highlighted[aria-selected]{background-color:#f7f7f7;border-left:3px solid #6fdbe8;color:#555}.select2-container--humhub .select2-results__option .select2-results__option{padding:6px 12px}.select2-container--humhub .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--humhub .select2-results__option .select2-results__option .select2-results__option{margin-left:-12px;padding-left:24px}.select2-container--humhub .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-24px;padding-left:36px}.select2-container--humhub .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-36px;padding-left:48px}.select2-container--humhub .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-48px;padding-left:60px}.select2-container--humhub .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-60px;padding-left:72px}.select2-container--humhub .select2-results__group{color:#777;display:block;padding:6px 12px;font-size:12px;line-height:1.42857143;white-space:nowrap}.select2-container--humhub.select2-container--focus .select2-selection,.select2-container--humhub.select2-container--open .select2-selection{border:2px solid #6fdbe8;outline:0;box-shadow:none}.select2-container--humhub.select2-container--open .select2-selection .select2-selection__arrow b{border-color:transparent transparent #999 transparent;border-width:0 4px 4px 4px}.select2-container--humhub .select2-selection__clear{color:#999;cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--humhub .select2-selection__clear:hover{color:#333}.select2-container--humhub.select2-container--disabled .select2-selection{border-color:#ccc;-webkit-box-shadow:none;box-shadow:none}.select2-container--humhub.select2-container--disabled .select2-selection,.select2-container--humhub.select2-container--disabled .select2-search__field{cursor:not-allowed}.select2-container--humhub.select2-container--disabled .select2-selection,.select2-container--humhub.select2-container--disabled .select2-selection--multiple .select2-selection__choice{background-color:#eee}.select2-container--humhub.select2-container--disabled .select2-selection__clear,.select2-container--humhub.select2-container--disabled .select2-selection--multiple .select2-selection__choice__remove{display:none}.select2-container--humhub .select2-dropdown{-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);border-color:#d7d7d7;overflow-x:hidden;margin-top:-1px}.select2-container--humhub .select2-dropdown--above{margin-top:1px}.select2-container--humhub .select2-results>.select2-results__options{max-height:400px;overflow-y:auto}.select2-container--humhub .select2-selection--single{height:34px;line-height:1.42857143;padding:6px 24px 6px 12px}.select2-container--humhub .select2-selection--single .select2-selection__arrow{position:absolute;bottom:0;right:12px;top:0;width:4px}.select2-container--humhub .select2-selection--single .select2-selection__arrow b{border-color:#999 transparent transparent transparent;border-style:solid;border-width:4px 4px 0 4px;height:0;left:0;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--humhub .select2-selection--single .select2-selection__rendered{color:#555;padding:0}.select2-container--humhub .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--humhub .select2-selection--multiple{min-height:34px;padding:2px}.select2-container--humhub .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;display:block;line-height:1.42857143;list-style:none;margin:0;overflow:hidden;padding:0;width:100%;text-overflow:ellipsis;white-space:nowrap}.select2-container--humhub .select2-selection--multiple .select2-selection__placeholder{color:#999;float:left;margin-top:5px}.select2-container--humhub .select2-selection--multiple .select2-selection__choice{color:#555;border-radius:4px;cursor:default;padding:0 6px;background-color:#6fdbe8;color:#fff;border-radius:3px;font-size:12px !important;padding:0 5px 2px 2px;float:left;margin:2px;height:28px}.select2-container--humhub .select2-selection--multiple .select2-selection__choice img,.select2-container--humhub .select2-selection--multiple .select2-selection__choice div{margin-right:5px}.select2-container--humhub .select2-selection--multiple .select2-selection__choice span.no-image{line-height:27px;padding-left:5px}.select2-container--humhub .select2-selection--multiple .select2-selection__choice i{margin:0px 2px;line-height:27px}.select2-container--humhub .select2-selection--multiple .select2-selection__choice .picker-close{cursor:pointer}.select2-container--humhub .select2-selection--multiple .select2-search--inline .select2-search__field{background:transparent;padding:0 5px;width:auto !important;height:32px;line-height:1.42857143;margin-top:0;min-width:5em}.select2-container--humhub .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:none;font-weight:bold;margin-right:3px}.select2-container--humhub .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--humhub .select2-selection--multiple .select2-selection__clear{margin-top:6px}.select2-container--humhub.input-sm,.select2-container--humhub.input-lg{border-radius:0;font-size:12px;height:auto;line-height:1;padding:0}.select2-container--humhub.input-sm .select2-selection--single,.input-group-sm .select2-container--humhub .select2-selection--single,.form-group-sm .select2-container--humhub .select2-selection--single{border-radius:3px;font-size:12px;height:30px;line-height:1.5;padding:5px 22px 5px 10px}.select2-container--humhub.input-sm .select2-selection--single .select2-selection__arrow b,.input-group-sm .select2-container--humhub .select2-selection--single .select2-selection__arrow b,.form-group-sm .select2-container--humhub .select2-selection--single .select2-selection__arrow b{margin-left:-5px}.select2-container--humhub.input-sm .select2-selection--multiple,.input-group-sm .select2-container--humhub .select2-selection--multiple,.form-group-sm .select2-container--humhub .select2-selection--multiple{min-height:30px}.select2-container--humhub.input-sm .select2-selection--multiple .select2-selection__choice,.input-group-sm .select2-container--humhub .select2-selection--multiple .select2-selection__choice,.form-group-sm .select2-container--humhub .select2-selection--multiple .select2-selection__choice{font-size:12px;line-height:1.5;margin:4px 0 0 5px;padding:0 5px}.select2-container--humhub.input-sm .select2-selection--multiple .select2-search--inline .select2-search__field,.input-group-sm .select2-container--humhub .select2-selection--multiple .select2-search--inline .select2-search__field,.form-group-sm .select2-container--humhub .select2-selection--multiple .select2-search--inline .select2-search__field{padding:0 10px;font-size:12px;height:28px;line-height:1.5}.select2-container--humhub.input-sm .select2-selection--multiple .select2-selection__clear,.input-group-sm .select2-container--humhub .select2-selection--multiple .select2-selection__clear,.form-group-sm .select2-container--humhub .select2-selection--multiple .select2-selection__clear{margin-top:5px}.select2-container--humhub.input-lg .select2-selection--single,.input-group-lg .select2-container--humhub .select2-selection--single,.form-group-lg .select2-container--humhub .select2-selection--single{border-radius:6px;font-size:18px;height:46px;line-height:1.3333333;padding:10px 31px 10px 16px}.select2-container--humhub.input-lg .select2-selection--single .select2-selection__arrow,.input-group-lg .select2-container--humhub .select2-selection--single .select2-selection__arrow,.form-group-lg .select2-container--humhub .select2-selection--single .select2-selection__arrow{width:5px}.select2-container--humhub.input-lg .select2-selection--single .select2-selection__arrow b,.input-group-lg .select2-container--humhub .select2-selection--single .select2-selection__arrow b,.form-group-lg .select2-container--humhub .select2-selection--single .select2-selection__arrow b{border-width:5px 5px 0 5px;margin-left:-5px;margin-left:-10px;margin-top:-2.5px}.select2-container--humhub.input-lg .select2-selection--multiple,.input-group-lg .select2-container--humhub .select2-selection--multiple,.form-group-lg .select2-container--humhub .select2-selection--multiple{min-height:46px}.select2-container--humhub.input-lg .select2-selection--multiple .select2-selection__choice,.input-group-lg .select2-container--humhub .select2-selection--multiple .select2-selection__choice,.form-group-lg .select2-container--humhub .select2-selection--multiple .select2-selection__choice{font-size:18px;line-height:1.3333333;border-radius:4px;margin:9px 0 0 8px;padding:0 10px}.select2-container--humhub.input-lg .select2-selection--multiple .select2-search--inline .select2-search__field,.input-group-lg .select2-container--humhub .select2-selection--multiple .select2-search--inline .select2-search__field,.form-group-lg .select2-container--humhub .select2-selection--multiple .select2-search--inline .select2-search__field{padding:0 16px;font-size:18px;height:44px;line-height:1.3333333}.select2-container--humhub.input-lg .select2-selection--multiple .select2-selection__clear,.input-group-lg .select2-container--humhub .select2-selection--multiple .select2-selection__clear,.form-group-lg .select2-container--humhub .select2-selection--multiple .select2-selection__clear{margin-top:10px}.select2-container--humhub.input-lg.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #999 transparent;border-width:0 5px 5px 5px}.input-group-lg .select2-container--humhub.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #999 transparent;border-width:0 5px 5px 5px}.select2-container--humhub[dir="rtl"] .select2-selection--single{padding-left:24px;padding-right:12px}.select2-container--humhub[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:0;padding-left:0;text-align:right}.select2-container--humhub[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--humhub[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:12px;right:auto}.select2-container--humhub[dir="rtl"] .select2-selection--single .select2-selection__arrow b{margin-left:0}.select2-container--humhub[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--humhub[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--humhub[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:0;margin-right:6px}.select2-container--humhub[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.has-warning .select2-dropdown,.has-warning .select2-selection{border-color:#fdd198}.has-warning .select2-container--focus .select2-selection,.has-warning .select2-container--open .select2-selection{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fffefc;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fffefc;border-color:#fcbb66}.has-warning.select2-drop-active{border-color:#fcbb66}.has-warning.select2-drop-active.select2-drop.select2-drop-above{border-top-color:#fcbb66}.has-error .select2-dropdown,.has-error .select2-selection{border-color:#ff8989}.has-error .select2-container--focus .select2-selection,.has-error .select2-container--open .select2-selection{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffefef;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffefef;border-color:#ff5656}.has-error.select2-drop-active{border-color:#ff5656}.has-error.select2-drop-active.select2-drop.select2-drop-above{border-top-color:#ff5656}.has-success .select2-dropdown,.has-success .select2-selection{border-color:#97d271}.has-success .select2-container--focus .select2-selection,.has-success .select2-container--open .select2-selection{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d0ebbe;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d0ebbe;border-color:#7bc64a}.has-success.select2-drop-active{border-color:#7bc64a}.has-success.select2-drop-active.select2-drop.select2-drop-above{border-top-color:#7bc64a}.input-group .select2-container--humhub{display:table;table-layout:fixed;position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group.select2-humhub-prepend .select2-container--humhub .select2-selection{border-bottom-left-radius:0;border-top-left-radius:0}.input-group.select2-humhub-append .select2-container--humhub .select2-selection{border-bottom-right-radius:0;border-top-right-radius:0}.select2-humhub-append .select2-container--humhub,.select2-humhub-prepend .select2-container--humhub,.select2-humhub-append .input-group-btn,.select2-humhub-prepend .input-group-btn,.select2-humhub-append .input-group-btn .btn,.select2-humhub-prepend .input-group-btn .btn{vertical-align:top}.form-control.select2-hidden-accessible{position:absolute !important;width:1px !important}.form-inline .select2-container--humhub{display:inline-block}ul.tag_input{list-style:none;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;padding:0 0 9px 4px}ul.tag_input li img{margin:0 5px 0 0}.tag_input_field{outline:none;border:none !important;padding:5px 4px 0 !important;width:170px;margin:2px 0 0 !important}.userInput,.spaceInput{background-color:#6fdbe8;font-weight:600;color:#fff;border-radius:3px;font-size:12px !important;padding:2px;float:left;margin:3px 4px 0 0}.userInput i,.spaceInput i{padding:0 6px;font-size:14px;cursor:pointer;line-height:8px}
\ No newline at end of file