nodebb-theme-harmony 2.0.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc +3 -3
- package/README.md +22 -22
- package/lib/controllers.js +29 -29
- package/library.js +183 -183
- package/package.json +48 -48
- package/plugin.json +24 -24
- package/public/.eslintrc +3 -3
- package/public/admin.js +15 -15
- package/public/harmony.js +287 -287
- package/public/settings.js +31 -31
- package/renovate.json +6 -6
- package/scss/account.scss +27 -27
- package/scss/category.scss +3 -3
- package/scss/chats.scss +11 -11
- package/scss/common.scss +122 -122
- package/scss/fonts.scss +19 -19
- package/scss/groups.scss +22 -22
- package/scss/harmony.scss +24 -24
- package/scss/header.scss +15 -15
- package/scss/mixins.scss +183 -183
- package/scss/modals.scss +6 -6
- package/scss/modules/breadcrumbs.scss +15 -15
- package/scss/modules/cover.scss +102 -102
- package/scss/modules/filters.scss +7 -7
- package/scss/modules/nprogress.scss +80 -80
- package/scss/modules/paginator.scss +23 -23
- package/scss/modules/tags.scss +5 -5
- package/scss/modules/topic-navigator.scss +52 -52
- package/scss/modules/topics-list.scss +40 -40
- package/scss/modules/user-menu.scss +10 -10
- package/scss/overrides.scss +65 -65
- package/scss/sidebar.scss +188 -188
- package/scss/skins.scss +58 -58
- package/scss/status.scss +24 -24
- package/scss/topic.scss +130 -130
- package/templates/account/blocks.tpl +51 -51
- package/templates/account/categories.tpl +63 -63
- package/templates/account/consent.tpl +73 -73
- package/templates/account/edit/password.tpl +34 -34
- package/templates/account/edit/username.tpl +29 -29
- package/templates/account/edit.tpl +137 -137
- package/templates/account/followers.tpl +14 -14
- package/templates/account/following.tpl +15 -15
- package/templates/account/groups.tpl +15 -15
- package/templates/account/info.tpl +270 -270
- package/templates/account/posts.tpl +35 -35
- package/templates/account/profile.tpl +92 -92
- package/templates/account/sessions.tpl +8 -8
- package/templates/account/settings.tpl +236 -236
- package/templates/account/shares.tpl +19 -19
- package/templates/account/tags.tpl +12 -12
- package/templates/account/theme.tpl +63 -63
- package/templates/account/topics.tpl +44 -44
- package/templates/account/uploads.tpl +37 -37
- package/templates/admin/plugins/harmony.tpl +57 -57
- package/templates/categories.tpl +29 -29
- package/templates/category.tpl +72 -72
- package/templates/footer.tpl +17 -17
- package/templates/groups/details.tpl +86 -86
- package/templates/groups/list.tpl +58 -58
- package/templates/groups/members.tpl +9 -9
- package/templates/header.tpl +45 -45
- package/templates/notifications.tpl +32 -32
- package/templates/partials/account/admin-menu.tpl +36 -36
- package/templates/partials/account/category-item.tpl +22 -22
- package/templates/partials/account/footer.tpl +2 -2
- package/templates/partials/account/header.tpl +98 -98
- package/templates/partials/account/session-list.tpl +18 -18
- package/templates/partials/account/sidebar-left.tpl +116 -116
- package/templates/partials/breadcrumbs-json-ld.tpl +15 -15
- package/templates/partials/breadcrumbs.tpl +12 -12
- package/templates/partials/buttons/newTopic.tpl +22 -22
- package/templates/partials/categories/item.tpl +56 -56
- package/templates/partials/categories/lastpost.tpl +24 -24
- package/templates/partials/categories/link.tpl +4 -4
- package/templates/partials/category/subcategory.tpl +18 -18
- package/templates/partials/category/tags.tpl +3 -3
- package/templates/partials/cookie-consent.tpl +6 -6
- package/templates/partials/groups/admin.tpl +95 -95
- package/templates/partials/groups/invited.tpl +32 -32
- package/templates/partials/groups/list.tpl +15 -15
- package/templates/partials/groups/memberlist.tpl +46 -46
- package/templates/partials/groups/pending.tpl +29 -29
- package/templates/partials/groups/sidebar-left.tpl +27 -27
- package/templates/partials/header/brand.tpl +27 -27
- package/templates/partials/mobile-footer.tpl +95 -95
- package/templates/partials/notifications_list.tpl +44 -44
- package/templates/partials/paginator.tpl +46 -46
- package/templates/partials/post_bar.tpl +27 -27
- package/templates/partials/posts_list.tpl +7 -7
- package/templates/partials/posts_list_item.tpl +19 -19
- package/templates/partials/quick-search-results.tpl +46 -46
- package/templates/partials/search-filters.tpl +183 -183
- package/templates/partials/search-results.tpl +54 -54
- package/templates/partials/sidebar/chats.tpl +45 -45
- package/templates/partials/sidebar/drafts.tpl +63 -63
- package/templates/partials/sidebar/logged-in-menu.tpl +22 -22
- package/templates/partials/sidebar/logged-out-menu.tpl +44 -44
- package/templates/partials/sidebar/notifications.tpl +49 -49
- package/templates/partials/sidebar/search-mobile.tpl +28 -28
- package/templates/partials/sidebar/search.tpl +30 -30
- package/templates/partials/sidebar/user-menu.tpl +103 -103
- package/templates/partials/sidebar-left.tpl +39 -39
- package/templates/partials/sidebar-right.tpl +16 -16
- package/templates/partials/skin-switcher.tpl +50 -50
- package/templates/partials/tags_list.tpl +7 -7
- package/templates/partials/toast.tpl +19 -19
- package/templates/partials/topic/event.tpl +12 -12
- package/templates/partials/topic/navigation-post.tpl +9 -9
- package/templates/partials/topic/navigator-mobile.tpl +61 -61
- package/templates/partials/topic/navigator.tpl +26 -26
- package/templates/partials/topic/necro-post.tpl +5 -5
- package/templates/partials/topic/post-menu-list.tpl +156 -156
- package/templates/partials/topic/post-menu.tpl +4 -4
- package/templates/partials/topic/post-placeholder.tpl +14 -14
- package/templates/partials/topic/post.tpl +146 -146
- package/templates/partials/topic/quickreply.tpl +28 -28
- package/templates/partials/topic/reply-button.tpl +26 -26
- package/templates/partials/topic/selection-tooltip.tpl +2 -2
- package/templates/partials/topic/sort.tpl +27 -27
- package/templates/partials/topic/stats.tpl +14 -14
- package/templates/partials/topic/thumbs.tpl +4 -4
- package/templates/partials/topic/tools.tpl +8 -8
- package/templates/partials/topic/topic-menu-list.tpl +73 -73
- package/templates/partials/topic/watch.tpl +59 -59
- package/templates/partials/topic-filters.tpl +15 -15
- package/templates/partials/topic-list-bar.tpl +54 -54
- package/templates/partials/topic-terms.tpl +15 -15
- package/templates/partials/topics_list.tpl +131 -131
- package/templates/partials/users/item.tpl +39 -39
- package/templates/partials/users_list.tpl +4 -4
- package/templates/partials/users_list_menu.tpl +14 -14
- package/templates/popular.tpl +34 -34
- package/templates/post-queue.tpl +211 -211
- package/templates/recent.tpl +42 -42
- package/templates/search.tpl +46 -46
- package/templates/tag.tpl +34 -34
- package/templates/tags.tpl +49 -49
- package/templates/top.tpl +34 -34
- package/templates/topic.tpl +123 -123
- package/templates/unread.tpl +31 -31
- package/templates/users.tpl +39 -39
- package/templates/world.tpl +66 -66
- package/theme.json +6 -6
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
<li component="categories/category" data-cid="{./cid}" class="w-100 border-bottom py-3 py-lg-4 gap-lg-0 gap-2 d-flex flex-column flex-lg-row align-items-start category-{./cid} {./unread-class}">
|
|
2
|
-
<meta itemprop="name" content="{./name}">
|
|
3
|
-
|
|
4
|
-
<div class="d-flex col-lg-7 gap-2 gap-lg-3">
|
|
5
|
-
<div class="flex-shrink-0">
|
|
6
|
-
{buildCategoryIcon(@value, "40px", "rounded-1")}
|
|
7
|
-
</div>
|
|
8
|
-
<div class="flex-grow-1 d-flex flex-wrap gap-1 me-0 me-lg-2">
|
|
9
|
-
<h2 class="title text-break fs-4 fw-semibold m-0 tracking-tight w-100">
|
|
10
|
-
<!-- IMPORT partials/categories/link.tpl -->
|
|
11
|
-
</h2>
|
|
12
|
-
{{{ if ./descriptionParsed }}}
|
|
13
|
-
<div class="description text-muted text-sm w-100">
|
|
14
|
-
{./descriptionParsed}
|
|
15
|
-
</div>
|
|
16
|
-
{{{ end }}}
|
|
17
|
-
{{{ if !config.hideSubCategories }}}
|
|
18
|
-
{{{ if ./children.length }}}
|
|
19
|
-
<ul class="list-unstyled category-children row row-cols-1 row-cols-md-2 g-2 my-1 w-100">
|
|
20
|
-
{{{ each ./children }}}
|
|
21
|
-
{{{ if !./isSection }}}
|
|
22
|
-
<li class="category-children-item small">
|
|
23
|
-
<div class="d-flex gap-1">
|
|
24
|
-
<i class="fa fa-fw fa-caret-right text-primary" style="line-height: var(--bs-body-line-height);"></i>
|
|
25
|
-
<a href="{{{ if ./link }}}{./link}{{{ else }}}{config.relative_path}/category/{./slug}{{{ end }}}" class="text-reset fw-semibold">{./name}</a>
|
|
26
|
-
</div>
|
|
27
|
-
</li>
|
|
28
|
-
{{{ end }}}
|
|
29
|
-
{{{ end }}}
|
|
30
|
-
</ul>
|
|
31
|
-
{{{ end }}}
|
|
32
|
-
{{{ end }}}
|
|
33
|
-
</div>
|
|
34
|
-
</div>
|
|
35
|
-
{{{ if !./link }}}
|
|
36
|
-
<div class="d-flex col-lg-5 col-12 align-content-stretch">
|
|
37
|
-
<div class="meta stats d-none d-lg-grid col-6 gap-1 pe-2 text-muted" style="grid-template-columns: 1fr 1fr;">
|
|
38
|
-
<div class="card card-header border-0 p-2 overflow-hidden rounded-1 d-flex flex-column align-items-center">
|
|
39
|
-
<span class="fs-5 ff-secondary lh-1" title="{./totalTopicCount}">{humanReadableNumber(./totalTopicCount, 0)}</span>
|
|
40
|
-
<span class="d-none d-xl-flex text-lowercase text-xs">[[global:topics]]</span>
|
|
41
|
-
<i class="d-xl-none fa fa-fw text-xs text-muted opacity-75 fa-list"></i>
|
|
42
|
-
</div>
|
|
43
|
-
<div class="card card-header border-0 p-2 overflow-hidden rounded-1 d-flex flex-column align-items-center">
|
|
44
|
-
<span class="fs-5 ff-secondary lh-1" title="{./totalPostCount}">{humanReadableNumber(./totalPostCount, 0)}</span>
|
|
45
|
-
<span class="d-none d-xl-flex text-lowercase text-xs">[[global:posts]]</span>
|
|
46
|
-
<i class="d-xl-none fa fa-fw text-xs text-muted opacity-75 fa-message"></i>
|
|
47
|
-
</div>
|
|
48
|
-
</div>
|
|
49
|
-
{{{ if !config.hideCategoryLastPost }}}
|
|
50
|
-
<div component="topic/teaser" class="teaser col-lg-6 col-12 {{{ if !config.theme.mobileTopicTeasers }}}d-none d-lg-block{{{ end }}}">
|
|
51
|
-
<!-- IMPORT partials/categories/lastpost.tpl -->
|
|
52
|
-
</div>
|
|
53
|
-
{{{ end }}}
|
|
54
|
-
</div>
|
|
55
|
-
{{{ end }}}
|
|
56
|
-
</li>
|
|
1
|
+
<li component="categories/category" data-cid="{./cid}" class="w-100 border-bottom py-3 py-lg-4 gap-lg-0 gap-2 d-flex flex-column flex-lg-row align-items-start category-{./cid} {./unread-class}">
|
|
2
|
+
<meta itemprop="name" content="{./name}">
|
|
3
|
+
|
|
4
|
+
<div class="d-flex col-lg-7 gap-2 gap-lg-3">
|
|
5
|
+
<div class="flex-shrink-0">
|
|
6
|
+
{buildCategoryIcon(@value, "40px", "rounded-1")}
|
|
7
|
+
</div>
|
|
8
|
+
<div class="flex-grow-1 d-flex flex-wrap gap-1 me-0 me-lg-2">
|
|
9
|
+
<h2 class="title text-break fs-4 fw-semibold m-0 tracking-tight w-100">
|
|
10
|
+
<!-- IMPORT partials/categories/link.tpl -->
|
|
11
|
+
</h2>
|
|
12
|
+
{{{ if ./descriptionParsed }}}
|
|
13
|
+
<div class="description text-muted text-sm w-100">
|
|
14
|
+
{./descriptionParsed}
|
|
15
|
+
</div>
|
|
16
|
+
{{{ end }}}
|
|
17
|
+
{{{ if !config.hideSubCategories }}}
|
|
18
|
+
{{{ if ./children.length }}}
|
|
19
|
+
<ul class="list-unstyled category-children row row-cols-1 row-cols-md-2 g-2 my-1 w-100">
|
|
20
|
+
{{{ each ./children }}}
|
|
21
|
+
{{{ if !./isSection }}}
|
|
22
|
+
<li class="category-children-item small">
|
|
23
|
+
<div class="d-flex gap-1">
|
|
24
|
+
<i class="fa fa-fw fa-caret-right text-primary" style="line-height: var(--bs-body-line-height);"></i>
|
|
25
|
+
<a href="{{{ if ./link }}}{./link}{{{ else }}}{config.relative_path}/category/{./slug}{{{ end }}}" class="text-reset fw-semibold">{./name}</a>
|
|
26
|
+
</div>
|
|
27
|
+
</li>
|
|
28
|
+
{{{ end }}}
|
|
29
|
+
{{{ end }}}
|
|
30
|
+
</ul>
|
|
31
|
+
{{{ end }}}
|
|
32
|
+
{{{ end }}}
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
{{{ if !./link }}}
|
|
36
|
+
<div class="d-flex col-lg-5 col-12 align-content-stretch">
|
|
37
|
+
<div class="meta stats d-none d-lg-grid col-6 gap-1 pe-2 text-muted" style="grid-template-columns: 1fr 1fr;">
|
|
38
|
+
<div class="card card-header border-0 p-2 overflow-hidden rounded-1 d-flex flex-column align-items-center">
|
|
39
|
+
<span class="fs-5 ff-secondary lh-1" title="{./totalTopicCount}">{humanReadableNumber(./totalTopicCount, 0)}</span>
|
|
40
|
+
<span class="d-none d-xl-flex text-lowercase text-xs">[[global:topics]]</span>
|
|
41
|
+
<i class="d-xl-none fa fa-fw text-xs text-muted opacity-75 fa-list"></i>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="card card-header border-0 p-2 overflow-hidden rounded-1 d-flex flex-column align-items-center">
|
|
44
|
+
<span class="fs-5 ff-secondary lh-1" title="{./totalPostCount}">{humanReadableNumber(./totalPostCount, 0)}</span>
|
|
45
|
+
<span class="d-none d-xl-flex text-lowercase text-xs">[[global:posts]]</span>
|
|
46
|
+
<i class="d-xl-none fa fa-fw text-xs text-muted opacity-75 fa-message"></i>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
{{{ if !config.hideCategoryLastPost }}}
|
|
50
|
+
<div component="topic/teaser" class="teaser col-lg-6 col-12 {{{ if !config.theme.mobileTopicTeasers }}}d-none d-lg-block{{{ end }}}">
|
|
51
|
+
<!-- IMPORT partials/categories/lastpost.tpl -->
|
|
52
|
+
</div>
|
|
53
|
+
{{{ end }}}
|
|
54
|
+
</div>
|
|
55
|
+
{{{ end }}}
|
|
56
|
+
</li>
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
<div class="lastpost border-start border-2 lh-sm h-100" style="border-color: {./bgColor}!important;">
|
|
2
|
-
{{{ each ./posts }}}
|
|
3
|
-
{{{ if @first }}}
|
|
4
|
-
<div component="category/posts" class="ps-2 text-xs d-flex flex-column h-100 gap-1">
|
|
5
|
-
<div class="text-nowrap text-truncate">
|
|
6
|
-
<a class="text-decoration-none avatar-tooltip" title="{./user.displayname}" href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(posts.user, "18px", true)}</a>
|
|
7
|
-
<a class="permalink text-muted timeago text-xs" href="{config.relative_path}/topic/{./topic.slug}{{{ if ./index }}}/{./index}{{{ end }}}" title="{./timestampISO}" aria-label="[[global:lastpost]]"></a>
|
|
8
|
-
</div>
|
|
9
|
-
<div class="post-content text-xs text-break line-clamp-sm-2 lh-sm position-relative flex-fill">
|
|
10
|
-
<a class="stretched-link" tabindex="-1" href="{config.relative_path}/topic/{./topic.slug}{{{ if ./index }}}/{./index}{{{ end }}}" aria-label="[[global:lastpost]]"></a>
|
|
11
|
-
{./content}
|
|
12
|
-
</div>
|
|
13
|
-
</div>
|
|
14
|
-
{{{ end }}}
|
|
15
|
-
{{{ end }}}
|
|
16
|
-
|
|
17
|
-
{{{ if !./posts.length }}}
|
|
18
|
-
<div component="category/posts" class="ps-2">
|
|
19
|
-
<div class="post-content overflow-hidden text-xs">
|
|
20
|
-
[[category:no-new-posts]]
|
|
21
|
-
</div>
|
|
22
|
-
</div>
|
|
23
|
-
{{{ end }}}
|
|
24
|
-
</div>
|
|
1
|
+
<div class="lastpost border-start border-2 lh-sm h-100" style="border-color: {./bgColor}!important;">
|
|
2
|
+
{{{ each ./posts }}}
|
|
3
|
+
{{{ if @first }}}
|
|
4
|
+
<div component="category/posts" class="ps-2 text-xs d-flex flex-column h-100 gap-1">
|
|
5
|
+
<div class="text-nowrap text-truncate">
|
|
6
|
+
<a class="text-decoration-none avatar-tooltip" title="{./user.displayname}" href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(posts.user, "18px", true)}</a>
|
|
7
|
+
<a class="permalink text-muted timeago text-xs" href="{config.relative_path}/topic/{./topic.slug}{{{ if ./index }}}/{./index}{{{ end }}}" title="{./timestampISO}" aria-label="[[global:lastpost]]"></a>
|
|
8
|
+
</div>
|
|
9
|
+
<div class="post-content text-xs text-break line-clamp-sm-2 lh-sm position-relative flex-fill">
|
|
10
|
+
<a class="stretched-link" tabindex="-1" href="{config.relative_path}/topic/{./topic.slug}{{{ if ./index }}}/{./index}{{{ end }}}" aria-label="[[global:lastpost]]"></a>
|
|
11
|
+
{./content}
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
{{{ end }}}
|
|
15
|
+
{{{ end }}}
|
|
16
|
+
|
|
17
|
+
{{{ if !./posts.length }}}
|
|
18
|
+
<div component="category/posts" class="ps-2">
|
|
19
|
+
<div class="post-content overflow-hidden text-xs">
|
|
20
|
+
[[category:no-new-posts]]
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
{{{ end }}}
|
|
24
|
+
</div>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
{{{ if ./isSection }}}
|
|
2
|
-
{./name}
|
|
3
|
-
{{{ else }}}
|
|
4
|
-
<a class="text-reset" href="{{{ if ./link }}}{./link}{{{ else }}}{config.relative_path}/category/{./slug}{{{ end }}}" itemprop="url">{../name}</a>
|
|
1
|
+
{{{ if ./isSection }}}
|
|
2
|
+
{./name}
|
|
3
|
+
{{{ else }}}
|
|
4
|
+
<a class="text-reset" href="{{{ if ./link }}}{./link}{{{ else }}}{config.relative_path}/category/{./slug}{{{ end }}}" itemprop="url">{../name}</a>
|
|
5
5
|
{{{ end }}}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
{{{ if children.length }}}
|
|
2
|
-
<div class="subcategory">
|
|
3
|
-
{{{ if hasMoreSubCategories }}}
|
|
4
|
-
<div class="mb-2"><!-- IMPORT partials/category/selector-dropdown-left.tpl --></div>
|
|
5
|
-
{{{ else }}}
|
|
6
|
-
<h3 class="fs-6 fw-semibold">[[category:subcategories]]</h3>
|
|
7
|
-
{{{ end }}}
|
|
8
|
-
|
|
9
|
-
<ul component="category/subcategory/container" class="categories-list list-unstyled" itemscope itemtype="http://www.schema.org/ItemList">
|
|
10
|
-
<li><hr class="text-muted"/></li>
|
|
11
|
-
{{{each children}}}
|
|
12
|
-
<!-- IMPORT partials/categories/item.tpl -->
|
|
13
|
-
{{{end}}}
|
|
14
|
-
</ul>
|
|
15
|
-
{{{ if hasMoreSubCategories}}}
|
|
16
|
-
<button class="btn btn-ghost btn-sm ff-secondary mb-2" component="category/load-more-subcategories">[[category:x-more-categories, {subCategoriesLeft}]]</button>
|
|
17
|
-
{{{ end }}}
|
|
18
|
-
</div>
|
|
1
|
+
{{{ if children.length }}}
|
|
2
|
+
<div class="subcategory">
|
|
3
|
+
{{{ if hasMoreSubCategories }}}
|
|
4
|
+
<div class="mb-2"><!-- IMPORT partials/category/selector-dropdown-left.tpl --></div>
|
|
5
|
+
{{{ else }}}
|
|
6
|
+
<h3 class="fs-6 fw-semibold">[[category:subcategories]]</h3>
|
|
7
|
+
{{{ end }}}
|
|
8
|
+
|
|
9
|
+
<ul component="category/subcategory/container" class="categories-list list-unstyled" itemscope itemtype="http://www.schema.org/ItemList">
|
|
10
|
+
<li><hr class="text-muted"/></li>
|
|
11
|
+
{{{each children}}}
|
|
12
|
+
<!-- IMPORT partials/categories/item.tpl -->
|
|
13
|
+
{{{end}}}
|
|
14
|
+
</ul>
|
|
15
|
+
{{{ if hasMoreSubCategories}}}
|
|
16
|
+
<button class="btn btn-ghost btn-sm ff-secondary mb-2" component="category/load-more-subcategories">[[category:x-more-categories, {subCategoriesLeft}]]</button>
|
|
17
|
+
{{{ end }}}
|
|
18
|
+
</div>
|
|
19
19
|
{{{ end }}}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
{{{ each tags }}}
|
|
2
|
-
<a href="{config.relative_path}/tags/{./valueEncoded}"><span class="badge border border-gray-300 fw-normal tag tag-class-{./class}" data-tag="{./value}">{./valueEscaped}</span></a>
|
|
3
|
-
{{{ end }}}
|
|
1
|
+
{{{ each tags }}}
|
|
2
|
+
<a href="{config.relative_path}/tags/{./valueEncoded}"><span class="badge border border-gray-300 fw-normal tag tag-class-{./class}" data-tag="{./value}">{./valueEscaped}</span></a>
|
|
3
|
+
{{{ end }}}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
<div class="position-fixed bottom-0 w-100 px-3 px-md-0 pb-5 mb-5 pb-lg-0 mb-lg-0" style="z-index: 2;">
|
|
2
|
-
<div class="cookie-consent d-flex flex-column flex-lg-row gap-2 text-bg-info col-12 col-sm-8 col-lg-6 p-3 mx-auto rounded mb-5 mb-md-3 justify-content-between align-items-center">
|
|
3
|
-
<span>{message} <a class="fw-bold" target="_blank" rel="noopener" href="{link_url}">{link}</a></span>
|
|
4
|
-
<button class="btn btn-primary text-nowrap">{dismiss}</button>
|
|
5
|
-
</div>
|
|
6
|
-
</div>
|
|
1
|
+
<div class="position-fixed bottom-0 w-100 px-3 px-md-0 pb-5 mb-5 pb-lg-0 mb-lg-0" style="z-index: 2;">
|
|
2
|
+
<div class="cookie-consent d-flex flex-column flex-lg-row gap-2 text-bg-info col-12 col-sm-8 col-lg-6 p-3 mx-auto rounded mb-5 mb-md-3 justify-content-between align-items-center">
|
|
3
|
+
<span>{message} <a class="fw-bold" target="_blank" rel="noopener" href="{link_url}">{link}</a></span>
|
|
4
|
+
<button class="btn btn-primary text-nowrap">{dismiss}</button>
|
|
5
|
+
</div>
|
|
6
|
+
</div>
|
|
@@ -1,95 +1,95 @@
|
|
|
1
|
-
<div class="options">
|
|
2
|
-
<form component="groups/settings" role="form">
|
|
3
|
-
<div class="row">
|
|
4
|
-
<div class="col-12 col-lg-6">
|
|
5
|
-
<div class="mb-3">
|
|
6
|
-
<label class="form-label" for="name">[[groups:details.group-name]]</label>
|
|
7
|
-
<input {{{ if group.system }}}readonly{{{ end }}} class="form-control" name="name" id="name" type="text" value="{group.displayName}" />
|
|
8
|
-
</div>
|
|
9
|
-
<div class="mb-3">
|
|
10
|
-
<label class="form-label" for="description">[[groups:details.description]]</label>
|
|
11
|
-
<textarea class="form-control" name="description" id="description" type="text" maxlength="255">{group.description}</textarea>
|
|
12
|
-
</div>
|
|
13
|
-
|
|
14
|
-
<div class="form-check">
|
|
15
|
-
<label class="form-check-label" for="private">[[groups:details.private]]</label>
|
|
16
|
-
<input class="form-check-input" name="private" id="private" type="checkbox"{{{ if group.private }}} checked{{{ end }}}>
|
|
17
|
-
{{{ if !allowPrivateGroups }}}
|
|
18
|
-
<p class="form-text">
|
|
19
|
-
[[groups:details.private-system-help]]
|
|
20
|
-
</p>
|
|
21
|
-
{{{ end }}}
|
|
22
|
-
<p class="form-text text-xs m-0">
|
|
23
|
-
[[groups:details.private-help]]
|
|
24
|
-
</p>
|
|
25
|
-
</div>
|
|
26
|
-
<div class="form-check">
|
|
27
|
-
<label class="form-check-label" for="hidden">[[groups:details.hidden]]</label>
|
|
28
|
-
<input class="form-check-input" name="hidden" id="hidden" type="checkbox"{{{ if group.hidden }}} checked{{{ end }}}>
|
|
29
|
-
<p class="form-text text-xs m-0">
|
|
30
|
-
[[groups:details.hidden-help]]
|
|
31
|
-
</p>
|
|
32
|
-
</div>
|
|
33
|
-
|
|
34
|
-
<div class="form-check">
|
|
35
|
-
<label class="form-check-label" for="disableJoinRequests">[[groups:details.disableJoinRequests]]</label>
|
|
36
|
-
<input class="form-check-input" name="disableJoinRequests" id="disableJoinRequests" type="checkbox"{{{ if group.disableJoinRequests }}} checked{{{ end }}}>
|
|
37
|
-
</div>
|
|
38
|
-
<div class="form-check">
|
|
39
|
-
<label class="form-check-label" for="disableLeave">[[groups:details.disableLeave]]</label>
|
|
40
|
-
<input class="form-check-input" name="disableLeave" id="disableLeave" type="checkbox"{{{if group.disableLeave}}} checked{{{end}}}>
|
|
41
|
-
</div>
|
|
42
|
-
</div>
|
|
43
|
-
<div class="col-12 col-lg-6">
|
|
44
|
-
<div class="d-flex gap-2 align-items-center">
|
|
45
|
-
<div class="form-check">
|
|
46
|
-
<label class="form-check-label" for="userTitleEnabled">[[groups:details.userTitleEnabled]]</label>
|
|
47
|
-
<input class="form-check-input" name="userTitleEnabled" id="userTitleEnabled" type="checkbox"{{{ if group.userTitleEnabled }}} checked{{{ end }}}>
|
|
48
|
-
</div>
|
|
49
|
-
<span class="badge rounded-1 text-uppercase text-truncate rounded-1 {{{ if !group.userTitleEnabled }}} hide{{{ end }}}" style="max-width:150px; color: {group.textColor}; background-color: {group.labelColor}"><i class="fa {{{ if group.icon }}} {group.icon}{{{ if group.userTitle}}} me-1{{{ end }}}{{{ end }}}"></i><span class="badge-text">{{{ if group.userTitle }}}{group.userTitle}{{{ end }}}</span></span>
|
|
50
|
-
</div>
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
<div class="mb-2">
|
|
54
|
-
<label class="form-label text-xs text-muted" for="userTitle">[[groups:details.badge-text]]</label>
|
|
55
|
-
<div class="d-flex gap-1">
|
|
56
|
-
<input component="groups/userTitleOption" class="form-control" name="userTitle" id="userTitle" type="text" maxlength="40" value="{group.userTitleEscaped}"{{{ if !group.userTitleEnabled }}} disabled{{{ end }}} />
|
|
57
|
-
<button component="groups/userTitleOption" type="button" class="btn btn-outline-secondary text-nowrap" data-action="icon-select"{{{ if !group.userTitleEnabled }}} disabled{{{ end }}}>[[groups:details.change-icon]]</button>
|
|
58
|
-
<input type="hidden" name="icon" value="{{{ if group.icon }}}{group.icon}{{{ end }}}" />
|
|
59
|
-
<div id="icons" class="hidden">
|
|
60
|
-
<div class="icon-container">
|
|
61
|
-
<div class="row nbb-fa-icons">
|
|
62
|
-
<!-- IMPORT partials/fontawesome.tpl -->
|
|
63
|
-
</div>
|
|
64
|
-
</div>
|
|
65
|
-
</div>
|
|
66
|
-
</div>
|
|
67
|
-
</div>
|
|
68
|
-
<div class="mb-2">
|
|
69
|
-
<label class="form-label text-xs text-muted" for="labelColor" class="badge-color-label">[[groups:details.change-label-colour]]</label>
|
|
70
|
-
<input class="form-control" component="groups/userTitleOption" type="color" name="labelColor" id="labelColor" value="{{{ if group.labelColor }}}{group.labelColor}{{{ end }}}" />
|
|
71
|
-
</div>
|
|
72
|
-
<div class="mb-2">
|
|
73
|
-
<label class="form-label text-xs text-muted" for="textColor" class="badge-color-label">[[groups:details.change-text-colour]]</label>
|
|
74
|
-
<input class="form-control" component="groups/userTitleOption" type="color" name="textColor" id="textColor" value="{{{ if group.textColor }}}{group.textColor}{{{ end }}}" />
|
|
75
|
-
</div>
|
|
76
|
-
</div>
|
|
77
|
-
</div>
|
|
78
|
-
|
|
79
|
-
<hr />
|
|
80
|
-
|
|
81
|
-
<div class="mb-3">
|
|
82
|
-
<label class="form-label" for="memberPostCids">[[groups:details.member-post-cids]]</label>
|
|
83
|
-
<div class="d-flex gap-1">
|
|
84
|
-
<div class="member-post-cids-selector">
|
|
85
|
-
<!-- IMPORT partials/category/selector-dropdown-left.tpl -->
|
|
86
|
-
</div>
|
|
87
|
-
<input id="memberPostCids" type="text" class="form-control form-control-sm" value="{group.memberPostCids}">
|
|
88
|
-
</div>
|
|
89
|
-
</div>
|
|
90
|
-
<div class="d-flex justify-content-end gap-2">
|
|
91
|
-
<button class="btn btn-link text-danger" type="button" data-action="delete">[[groups:details.delete-group]]</button>
|
|
92
|
-
<button class="btn btn-primary" type="button" data-action="update">[[global:save-changes]]</button>
|
|
93
|
-
</div>
|
|
94
|
-
</form>
|
|
95
|
-
</div>
|
|
1
|
+
<div class="options">
|
|
2
|
+
<form component="groups/settings" role="form">
|
|
3
|
+
<div class="row">
|
|
4
|
+
<div class="col-12 col-lg-6">
|
|
5
|
+
<div class="mb-3">
|
|
6
|
+
<label class="form-label" for="name">[[groups:details.group-name]]</label>
|
|
7
|
+
<input {{{ if group.system }}}readonly{{{ end }}} class="form-control" name="name" id="name" type="text" value="{group.displayName}" />
|
|
8
|
+
</div>
|
|
9
|
+
<div class="mb-3">
|
|
10
|
+
<label class="form-label" for="description">[[groups:details.description]]</label>
|
|
11
|
+
<textarea class="form-control" name="description" id="description" type="text" maxlength="255">{group.description}</textarea>
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
<div class="form-check">
|
|
15
|
+
<label class="form-check-label" for="private">[[groups:details.private]]</label>
|
|
16
|
+
<input class="form-check-input" name="private" id="private" type="checkbox"{{{ if group.private }}} checked{{{ end }}}>
|
|
17
|
+
{{{ if !allowPrivateGroups }}}
|
|
18
|
+
<p class="form-text">
|
|
19
|
+
[[groups:details.private-system-help]]
|
|
20
|
+
</p>
|
|
21
|
+
{{{ end }}}
|
|
22
|
+
<p class="form-text text-xs m-0">
|
|
23
|
+
[[groups:details.private-help]]
|
|
24
|
+
</p>
|
|
25
|
+
</div>
|
|
26
|
+
<div class="form-check">
|
|
27
|
+
<label class="form-check-label" for="hidden">[[groups:details.hidden]]</label>
|
|
28
|
+
<input class="form-check-input" name="hidden" id="hidden" type="checkbox"{{{ if group.hidden }}} checked{{{ end }}}>
|
|
29
|
+
<p class="form-text text-xs m-0">
|
|
30
|
+
[[groups:details.hidden-help]]
|
|
31
|
+
</p>
|
|
32
|
+
</div>
|
|
33
|
+
|
|
34
|
+
<div class="form-check">
|
|
35
|
+
<label class="form-check-label" for="disableJoinRequests">[[groups:details.disableJoinRequests]]</label>
|
|
36
|
+
<input class="form-check-input" name="disableJoinRequests" id="disableJoinRequests" type="checkbox"{{{ if group.disableJoinRequests }}} checked{{{ end }}}>
|
|
37
|
+
</div>
|
|
38
|
+
<div class="form-check">
|
|
39
|
+
<label class="form-check-label" for="disableLeave">[[groups:details.disableLeave]]</label>
|
|
40
|
+
<input class="form-check-input" name="disableLeave" id="disableLeave" type="checkbox"{{{if group.disableLeave}}} checked{{{end}}}>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="col-12 col-lg-6">
|
|
44
|
+
<div class="d-flex gap-2 align-items-center">
|
|
45
|
+
<div class="form-check">
|
|
46
|
+
<label class="form-check-label" for="userTitleEnabled">[[groups:details.userTitleEnabled]]</label>
|
|
47
|
+
<input class="form-check-input" name="userTitleEnabled" id="userTitleEnabled" type="checkbox"{{{ if group.userTitleEnabled }}} checked{{{ end }}}>
|
|
48
|
+
</div>
|
|
49
|
+
<span class="badge rounded-1 text-uppercase text-truncate rounded-1 {{{ if !group.userTitleEnabled }}} hide{{{ end }}}" style="max-width:150px; color: {group.textColor}; background-color: {group.labelColor}"><i class="fa {{{ if group.icon }}} {group.icon}{{{ if group.userTitle}}} me-1{{{ end }}}{{{ end }}}"></i><span class="badge-text">{{{ if group.userTitle }}}{group.userTitle}{{{ end }}}</span></span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
<div class="mb-2">
|
|
54
|
+
<label class="form-label text-xs text-muted" for="userTitle">[[groups:details.badge-text]]</label>
|
|
55
|
+
<div class="d-flex gap-1">
|
|
56
|
+
<input component="groups/userTitleOption" class="form-control" name="userTitle" id="userTitle" type="text" maxlength="40" value="{group.userTitleEscaped}"{{{ if !group.userTitleEnabled }}} disabled{{{ end }}} />
|
|
57
|
+
<button component="groups/userTitleOption" type="button" class="btn btn-outline-secondary text-nowrap" data-action="icon-select"{{{ if !group.userTitleEnabled }}} disabled{{{ end }}}>[[groups:details.change-icon]]</button>
|
|
58
|
+
<input type="hidden" name="icon" value="{{{ if group.icon }}}{group.icon}{{{ end }}}" />
|
|
59
|
+
<div id="icons" class="hidden">
|
|
60
|
+
<div class="icon-container">
|
|
61
|
+
<div class="row nbb-fa-icons">
|
|
62
|
+
<!-- IMPORT partials/fontawesome.tpl -->
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
<div class="mb-2">
|
|
69
|
+
<label class="form-label text-xs text-muted" for="labelColor" class="badge-color-label">[[groups:details.change-label-colour]]</label>
|
|
70
|
+
<input class="form-control" component="groups/userTitleOption" type="color" name="labelColor" id="labelColor" value="{{{ if group.labelColor }}}{group.labelColor}{{{ end }}}" />
|
|
71
|
+
</div>
|
|
72
|
+
<div class="mb-2">
|
|
73
|
+
<label class="form-label text-xs text-muted" for="textColor" class="badge-color-label">[[groups:details.change-text-colour]]</label>
|
|
74
|
+
<input class="form-control" component="groups/userTitleOption" type="color" name="textColor" id="textColor" value="{{{ if group.textColor }}}{group.textColor}{{{ end }}}" />
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
<hr />
|
|
80
|
+
|
|
81
|
+
<div class="mb-3">
|
|
82
|
+
<label class="form-label" for="memberPostCids">[[groups:details.member-post-cids]]</label>
|
|
83
|
+
<div class="d-flex gap-1">
|
|
84
|
+
<div class="member-post-cids-selector">
|
|
85
|
+
<!-- IMPORT partials/category/selector-dropdown-left.tpl -->
|
|
86
|
+
</div>
|
|
87
|
+
<input id="memberPostCids" type="text" class="form-control form-control-sm" value="{group.memberPostCids}">
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
<div class="d-flex justify-content-end gap-2">
|
|
91
|
+
<button class="btn btn-link text-danger" type="button" data-action="delete">[[groups:details.delete-group]]</button>
|
|
92
|
+
<button class="btn btn-primary" type="button" data-action="update">[[global:save-changes]]</button>
|
|
93
|
+
</div>
|
|
94
|
+
</form>
|
|
95
|
+
</div>
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
<label class="text-xs text-muted">[[groups:invited.search]]</label>
|
|
2
|
-
<div class="input-group mb-2">
|
|
3
|
-
<input class="form-control" type="text" component="groups/members/invite"/>
|
|
4
|
-
<span class="input-group-text search-button"><i class="fa fa-search"></i></span>
|
|
5
|
-
</div>
|
|
6
|
-
|
|
7
|
-
<div class="mb-2">
|
|
8
|
-
<label class="text-xs text-muted">[[groups:bulk-invite-instructions]]</label>
|
|
9
|
-
<textarea class="form-control" component="groups/members/bulk-invite"></textarea>
|
|
10
|
-
</div>
|
|
11
|
-
|
|
12
|
-
<div class="mb-2 clearfix">
|
|
13
|
-
<button type="button" class="btn btn-primary btn-sm float-end" component="groups/members/bulk-invite-button">[[groups:bulk-invite]]</button>
|
|
14
|
-
</div>
|
|
15
|
-
|
|
16
|
-
<div style="max-height: 500px; overflow: auto;">
|
|
17
|
-
<div component="groups/invited/alert" class="alert alert-info {{{ if group.invited.length }}}hidden{{{ end }}}">[[groups:invited.none]]</div>
|
|
18
|
-
<table component="groups/invited" class="table table-hover">
|
|
19
|
-
<tbody>
|
|
20
|
-
{{{ each group.invited }}}
|
|
21
|
-
<tr data-uid="{group.invited.uid}" class="align-middle">
|
|
22
|
-
<td class="member-name p-2 d-flex align-items-center justify-content-between">
|
|
23
|
-
<div class="d-flex align-items-center gap-2">
|
|
24
|
-
<a class="text-decoration-none" href="{config.relative_path}/user/{group.invited.userslug}">{buildAvatar(group.invited, "24px", true)}</a>
|
|
25
|
-
<a href="{config.relative_path}/user/{group.invited.userslug}">{group.invited.username}</a>
|
|
26
|
-
</div>
|
|
27
|
-
<button class="btn btn-outline-secondary btn-sm text-nowrap" data-action="rescindInvite">[[groups:invited.uninvite]]</button>
|
|
28
|
-
</td>
|
|
29
|
-
</tr>
|
|
30
|
-
{{{ end }}}
|
|
31
|
-
</tbody>
|
|
32
|
-
</table>
|
|
1
|
+
<label class="text-xs text-muted">[[groups:invited.search]]</label>
|
|
2
|
+
<div class="input-group mb-2">
|
|
3
|
+
<input class="form-control" type="text" component="groups/members/invite"/>
|
|
4
|
+
<span class="input-group-text search-button"><i class="fa fa-search"></i></span>
|
|
5
|
+
</div>
|
|
6
|
+
|
|
7
|
+
<div class="mb-2">
|
|
8
|
+
<label class="text-xs text-muted">[[groups:bulk-invite-instructions]]</label>
|
|
9
|
+
<textarea class="form-control" component="groups/members/bulk-invite"></textarea>
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
<div class="mb-2 clearfix">
|
|
13
|
+
<button type="button" class="btn btn-primary btn-sm float-end" component="groups/members/bulk-invite-button">[[groups:bulk-invite]]</button>
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
<div style="max-height: 500px; overflow: auto;">
|
|
17
|
+
<div component="groups/invited/alert" class="alert alert-info {{{ if group.invited.length }}}hidden{{{ end }}}">[[groups:invited.none]]</div>
|
|
18
|
+
<table component="groups/invited" class="table table-hover">
|
|
19
|
+
<tbody>
|
|
20
|
+
{{{ each group.invited }}}
|
|
21
|
+
<tr data-uid="{group.invited.uid}" class="align-middle">
|
|
22
|
+
<td class="member-name p-2 d-flex align-items-center justify-content-between">
|
|
23
|
+
<div class="d-flex align-items-center gap-2">
|
|
24
|
+
<a class="text-decoration-none" href="{config.relative_path}/user/{group.invited.userslug}">{buildAvatar(group.invited, "24px", true)}</a>
|
|
25
|
+
<a href="{config.relative_path}/user/{group.invited.userslug}">{group.invited.username}</a>
|
|
26
|
+
</div>
|
|
27
|
+
<button class="btn btn-outline-secondary btn-sm text-nowrap" data-action="rescindInvite">[[groups:invited.uninvite]]</button>
|
|
28
|
+
</td>
|
|
29
|
+
</tr>
|
|
30
|
+
{{{ end }}}
|
|
31
|
+
</tbody>
|
|
32
|
+
</table>
|
|
33
33
|
</div>
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
{{{ each groups }}}
|
|
2
|
-
<div class="col-xl-4 col-lg-6 col-sm-12 mb-3" component="groups/summary" data-slug="{./slug}">
|
|
3
|
-
<div class="card h-100 group-hover-bg border-0">
|
|
4
|
-
<a href="{config.relative_path}/groups/{./slug}" class="card-header border-bottom-0 pointer d-block list-cover" style="{{{ if ./cover:thumb:url }}}background-image: url({./cover:thumb:url});background-size: cover; min-height: 125px; background-position: {./cover:position}{{{ end }}}" aria-label="[[aria:group-page-link-for, {./displayName}]]"></a>
|
|
5
|
-
<a href="{config.relative_path}/groups/{./slug}" class="d-block h-100 text-reset text-decoration-none">
|
|
6
|
-
<div class="card-body d-flex flex-column gap-1 border border-top-0 rounded-bottom h-100">
|
|
7
|
-
<div class="d-flex">
|
|
8
|
-
<div class="flex-grow-1 fs-6 fw-semibold">{./displayName}</div>
|
|
9
|
-
<div class="flex-shrink-0 text-sm"><i class="text-muted fa-solid fa-user"></i> {formattedNumber(./memberCount)}</div>
|
|
10
|
-
</div>
|
|
11
|
-
<div class="text-sm">{./description}</div>
|
|
12
|
-
</div>
|
|
13
|
-
</a>
|
|
14
|
-
</div>
|
|
15
|
-
</div>
|
|
1
|
+
{{{ each groups }}}
|
|
2
|
+
<div class="col-xl-4 col-lg-6 col-sm-12 mb-3" component="groups/summary" data-slug="{./slug}">
|
|
3
|
+
<div class="card h-100 group-hover-bg border-0">
|
|
4
|
+
<a href="{config.relative_path}/groups/{./slug}" class="card-header border-bottom-0 pointer d-block list-cover" style="{{{ if ./cover:thumb:url }}}background-image: url({./cover:thumb:url});background-size: cover; min-height: 125px; background-position: {./cover:position}{{{ end }}}" aria-label="[[aria:group-page-link-for, {./displayName}]]"></a>
|
|
5
|
+
<a href="{config.relative_path}/groups/{./slug}" class="d-block h-100 text-reset text-decoration-none">
|
|
6
|
+
<div class="card-body d-flex flex-column gap-1 border border-top-0 rounded-bottom h-100">
|
|
7
|
+
<div class="d-flex">
|
|
8
|
+
<div class="flex-grow-1 fs-6 fw-semibold">{./displayName}</div>
|
|
9
|
+
<div class="flex-shrink-0 text-sm"><i class="text-muted fa-solid fa-user"></i> {formattedNumber(./memberCount)}</div>
|
|
10
|
+
</div>
|
|
11
|
+
<div class="text-sm">{./description}</div>
|
|
12
|
+
</div>
|
|
13
|
+
</a>
|
|
14
|
+
</div>
|
|
15
|
+
</div>
|
|
16
16
|
{{{ end }}}
|