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,47 +1,47 @@
|
|
|
1
|
-
<div class="d-flex {{{ if group.isOwner }}}justify-content-between{{{ else }}}justify-content-end{{{ end }}} mb-3">
|
|
2
|
-
{{{ if isAdmin }}}
|
|
3
|
-
<div class="flex-shrink-0">
|
|
4
|
-
<button component="groups/members/add" type="button" class="btn btn-primary btn-sm me-3" title="[[groups:details.add-member]]"><i class="fa fa-user-plus"></i> [[groups:details.add-member]]</button>
|
|
5
|
-
</div>
|
|
6
|
-
{{{ end }}}
|
|
7
|
-
<div>
|
|
8
|
-
<div class="input-group">
|
|
9
|
-
<input class="form-control form-control-sm" type="text" component="groups/members/search" placeholder="[[global:search]]"/>
|
|
10
|
-
<button class="btn btn-primary btn-sm search-button" type="button">
|
|
11
|
-
<i class="fa fa-search"></i>
|
|
12
|
-
</button>
|
|
13
|
-
</div>
|
|
14
|
-
</div>
|
|
15
|
-
</div>
|
|
16
|
-
|
|
17
|
-
<div component="groups/members" data-nextstart="{group.membersNextStart}" class="mb-5" style="max-height: 500px; overflow: auto;">
|
|
18
|
-
<table class="table table-hover">
|
|
19
|
-
<tbody>
|
|
20
|
-
{{{each group.members}}}
|
|
21
|
-
<tr class="w-100" data-uid="{group.members.uid}" data-isowner="{{{ if group.members.isOwner }}}1{{{ else }}}0{{{ end }}}">
|
|
22
|
-
<td class="member-name p-2 w-100 ">
|
|
23
|
-
<div class="d-flex align-items-center justify-content-between">
|
|
24
|
-
<div class="d-flex align-items-center gap-2">
|
|
25
|
-
<a class="text-decoration-none" href="{config.relative_path}/user/{group.members.userslug}">{buildAvatar(group.members, "24px", true)}</a>
|
|
26
|
-
<a class="align-text-top" href="{config.relative_path}/user/{group.members.userslug}">{group.members.username}</a>
|
|
27
|
-
<i component="groups/owner/icon" title="[[groups:owner]]" class="user-owner-icon fa fa-star align-text-top text-warning {{{ if !group.members.isOwner }}}invisible{{{ end }}}"></i>
|
|
28
|
-
</div>
|
|
29
|
-
|
|
30
|
-
{{{ if group.isOwner }}}
|
|
31
|
-
<div class="owner-controls d-flex gap-1">
|
|
32
|
-
<a class="btn btn-light btn-sm" href="#" data-ajaxify="false" data-action="toggleOwnership" title="[[groups:details.grant]]">
|
|
33
|
-
<i class="fa fa-star text-warning"></i>
|
|
34
|
-
</a>
|
|
35
|
-
|
|
36
|
-
<a class="btn btn-light btn-sm" href="#" data-ajaxify="false" data-action="kick" title="[[groups:details.kick]]">
|
|
37
|
-
<i class="fa fa-ban text-danger"></i>
|
|
38
|
-
</a>
|
|
39
|
-
</div>
|
|
40
|
-
{{{ end }}}
|
|
41
|
-
</div>
|
|
42
|
-
</td>
|
|
43
|
-
</tr>
|
|
44
|
-
{{{end}}}
|
|
45
|
-
</tbody>
|
|
46
|
-
</table>
|
|
1
|
+
<div class="d-flex {{{ if group.isOwner }}}justify-content-between{{{ else }}}justify-content-end{{{ end }}} mb-3">
|
|
2
|
+
{{{ if isAdmin }}}
|
|
3
|
+
<div class="flex-shrink-0">
|
|
4
|
+
<button component="groups/members/add" type="button" class="btn btn-primary btn-sm me-3" title="[[groups:details.add-member]]"><i class="fa fa-user-plus"></i> [[groups:details.add-member]]</button>
|
|
5
|
+
</div>
|
|
6
|
+
{{{ end }}}
|
|
7
|
+
<div>
|
|
8
|
+
<div class="input-group">
|
|
9
|
+
<input class="form-control form-control-sm" type="text" component="groups/members/search" placeholder="[[global:search]]"/>
|
|
10
|
+
<button class="btn btn-primary btn-sm search-button" type="button">
|
|
11
|
+
<i class="fa fa-search"></i>
|
|
12
|
+
</button>
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
<div component="groups/members" data-nextstart="{group.membersNextStart}" class="mb-5" style="max-height: 500px; overflow: auto;">
|
|
18
|
+
<table class="table table-hover">
|
|
19
|
+
<tbody>
|
|
20
|
+
{{{each group.members}}}
|
|
21
|
+
<tr class="w-100" data-uid="{group.members.uid}" data-isowner="{{{ if group.members.isOwner }}}1{{{ else }}}0{{{ end }}}">
|
|
22
|
+
<td class="member-name p-2 w-100 ">
|
|
23
|
+
<div class="d-flex align-items-center justify-content-between">
|
|
24
|
+
<div class="d-flex align-items-center gap-2">
|
|
25
|
+
<a class="text-decoration-none" href="{config.relative_path}/user/{group.members.userslug}">{buildAvatar(group.members, "24px", true)}</a>
|
|
26
|
+
<a class="align-text-top" href="{config.relative_path}/user/{group.members.userslug}">{group.members.username}</a>
|
|
27
|
+
<i component="groups/owner/icon" title="[[groups:owner]]" class="user-owner-icon fa fa-star align-text-top text-warning {{{ if !group.members.isOwner }}}invisible{{{ end }}}"></i>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
{{{ if group.isOwner }}}
|
|
31
|
+
<div class="owner-controls d-flex gap-1">
|
|
32
|
+
<a class="btn btn-light btn-sm" href="#" data-ajaxify="false" data-action="toggleOwnership" title="[[groups:details.grant]]">
|
|
33
|
+
<i class="fa fa-star text-warning"></i>
|
|
34
|
+
</a>
|
|
35
|
+
|
|
36
|
+
<a class="btn btn-light btn-sm" href="#" data-ajaxify="false" data-action="kick" title="[[groups:details.kick]]">
|
|
37
|
+
<i class="fa fa-ban text-danger"></i>
|
|
38
|
+
</a>
|
|
39
|
+
</div>
|
|
40
|
+
{{{ end }}}
|
|
41
|
+
</div>
|
|
42
|
+
</td>
|
|
43
|
+
</tr>
|
|
44
|
+
{{{end}}}
|
|
45
|
+
</tbody>
|
|
46
|
+
</table>
|
|
47
47
|
</div>
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
{{{ if group.pending.length }}}
|
|
2
|
-
<div class="d-flex justify-content-end gap-2 mb-3">
|
|
3
|
-
<button class="btn btn-danger btn-sm" data-action="rejectAll">[[groups:pending.reject-all]]</button>
|
|
4
|
-
<button class="btn btn-success btn-sm" data-action="acceptAll">[[groups:pending.accept-all]]</button>
|
|
5
|
-
|
|
6
|
-
</div>
|
|
7
|
-
{{{ end }}}
|
|
8
|
-
|
|
9
|
-
<div style="max-height: 500px;overflow: auto;">
|
|
10
|
-
<div component="groups/pending/alert" class="alert alert-info {{{ if group.pending.length }}}hidden{{{ end }}}">[[groups:pending.none]]</div>
|
|
11
|
-
<table component="groups/pending" class="table table-hover">
|
|
12
|
-
<tbody>
|
|
13
|
-
{{{ each group.pending }}}
|
|
14
|
-
<tr data-uid="{group.pending.uid}" class="align-middle">
|
|
15
|
-
<td class="member-name p-2 d-flex align-items-center justify-content-between">
|
|
16
|
-
<div class="d-flex gap-2">
|
|
17
|
-
<a class="text-decoration-none" href="{config.relative_path}/user/{group.pending.userslug}">{buildAvatar(group.pending, "24px", true)}</a>
|
|
18
|
-
<a href="{config.relative_path}/user/{group.pending.userslug}">{group.pending.username}</a>
|
|
19
|
-
</div>
|
|
20
|
-
<div class="d-flex gap-2">
|
|
21
|
-
<button class="btn btn-danger btn-sm" data-action="reject">[[groups:pending.reject]]</a></li>
|
|
22
|
-
<button class="btn btn-success btn-sm" data-action="accept">[[groups:pending.accept]]</a></li>
|
|
23
|
-
</div>
|
|
24
|
-
</td>
|
|
25
|
-
</tr>
|
|
26
|
-
{{{ end }}}
|
|
27
|
-
</tbody>
|
|
28
|
-
</table>
|
|
29
|
-
</div>
|
|
1
|
+
{{{ if group.pending.length }}}
|
|
2
|
+
<div class="d-flex justify-content-end gap-2 mb-3">
|
|
3
|
+
<button class="btn btn-danger btn-sm" data-action="rejectAll">[[groups:pending.reject-all]]</button>
|
|
4
|
+
<button class="btn btn-success btn-sm" data-action="acceptAll">[[groups:pending.accept-all]]</button>
|
|
5
|
+
|
|
6
|
+
</div>
|
|
7
|
+
{{{ end }}}
|
|
8
|
+
|
|
9
|
+
<div style="max-height: 500px;overflow: auto;">
|
|
10
|
+
<div component="groups/pending/alert" class="alert alert-info {{{ if group.pending.length }}}hidden{{{ end }}}">[[groups:pending.none]]</div>
|
|
11
|
+
<table component="groups/pending" class="table table-hover">
|
|
12
|
+
<tbody>
|
|
13
|
+
{{{ each group.pending }}}
|
|
14
|
+
<tr data-uid="{group.pending.uid}" class="align-middle">
|
|
15
|
+
<td class="member-name p-2 d-flex align-items-center justify-content-between">
|
|
16
|
+
<div class="d-flex gap-2">
|
|
17
|
+
<a class="text-decoration-none" href="{config.relative_path}/user/{group.pending.userslug}">{buildAvatar(group.pending, "24px", true)}</a>
|
|
18
|
+
<a href="{config.relative_path}/user/{group.pending.userslug}">{group.pending.username}</a>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="d-flex gap-2">
|
|
21
|
+
<button class="btn btn-danger btn-sm" data-action="reject">[[groups:pending.reject]]</a></li>
|
|
22
|
+
<button class="btn btn-success btn-sm" data-action="accept">[[groups:pending.accept]]</a></li>
|
|
23
|
+
</div>
|
|
24
|
+
</td>
|
|
25
|
+
</tr>
|
|
26
|
+
{{{ end }}}
|
|
27
|
+
</tbody>
|
|
28
|
+
</table>
|
|
29
|
+
</div>
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
<div class="flex-shrink-0 pe-2 border-end-md text-sm mb-3 flex-basis-md-200">
|
|
2
|
-
<div class="nav sticky-md-top d-flex flex-row flex-md-column flex-wrap gap-1" style="top: 1rem; z-index: 1;">
|
|
3
|
-
<button data-bs-toggle="tab" data-bs-target="#groups-posts" class="btn btn-ghost btn-sm text-start d-flex align-items-center ff-secondary fw-semibold {{{ if template.groups/details }}}active{{{ end }}}">
|
|
4
|
-
<div class="flex-grow-1">[[global:posts]]</div>
|
|
5
|
-
</button>
|
|
6
|
-
<button data-bs-toggle="tab" data-bs-target="#groups-members" class="btn btn-ghost btn-sm text-start d-flex align-items-center ff-secondary fw-semibold gap-2">
|
|
7
|
-
<div class="flex-grow-1">[[groups:members]]</div>
|
|
8
|
-
<span component="group/member/count" class="flex-shrink-0 text-xs lh-1" title="{group.memberCount}">{humanReadableNumber(group.memberCount)}</span>
|
|
9
|
-
</button>
|
|
10
|
-
|
|
11
|
-
{{{ if group.isOwner }}}
|
|
12
|
-
<button data-bs-toggle="tab" data-bs-target="#groups-pending" class="btn btn-ghost btn-sm text-start d-flex align-items-center ff-secondary fw-semibold gap-2">
|
|
13
|
-
<div class="flex-grow-1">[[groups:details.pending]]</div>
|
|
14
|
-
<span component="group/pending/count" class="flex-shrink-0 text-xs lh-1" title="{group.pending.length}">{humanReadableNumber(group.pending.length)}</span>
|
|
15
|
-
</button>
|
|
16
|
-
|
|
17
|
-
<button data-bs-toggle="tab" data-bs-target="#groups-invited" class="btn btn-ghost btn-sm text-start d-flex align-items-center ff-secondary fw-semibold gap-2">
|
|
18
|
-
<div class="flex-grow-1">[[groups:details.invited]]</div>
|
|
19
|
-
<span component="group/invited/count" class="flex-shrink-0 text-xs lh-1" title="{group.invited.length}">{humanReadableNumber(group.invited.length)}</span>
|
|
20
|
-
</button>
|
|
21
|
-
|
|
22
|
-
<button data-bs-toggle="tab" data-bs-target="#groups-admin" class="btn btn-ghost btn-sm text-start d-flex align-items-center ff-secondary fw-semibold">
|
|
23
|
-
<div class="flex-grow-1">[[global:header.admin]]</div>
|
|
24
|
-
</button>
|
|
25
|
-
{{{ end }}}
|
|
26
|
-
</div>
|
|
27
|
-
</div>
|
|
1
|
+
<div class="flex-shrink-0 pe-2 border-end-md text-sm mb-3 flex-basis-md-200">
|
|
2
|
+
<div class="nav sticky-md-top d-flex flex-row flex-md-column flex-wrap gap-1" style="top: 1rem; z-index: 1;">
|
|
3
|
+
<button data-bs-toggle="tab" data-bs-target="#groups-posts" class="btn btn-ghost btn-sm text-start d-flex align-items-center ff-secondary fw-semibold {{{ if template.groups/details }}}active{{{ end }}}">
|
|
4
|
+
<div class="flex-grow-1">[[global:posts]]</div>
|
|
5
|
+
</button>
|
|
6
|
+
<button data-bs-toggle="tab" data-bs-target="#groups-members" class="btn btn-ghost btn-sm text-start d-flex align-items-center ff-secondary fw-semibold gap-2">
|
|
7
|
+
<div class="flex-grow-1">[[groups:members]]</div>
|
|
8
|
+
<span component="group/member/count" class="flex-shrink-0 text-xs lh-1" title="{group.memberCount}">{humanReadableNumber(group.memberCount)}</span>
|
|
9
|
+
</button>
|
|
10
|
+
|
|
11
|
+
{{{ if group.isOwner }}}
|
|
12
|
+
<button data-bs-toggle="tab" data-bs-target="#groups-pending" class="btn btn-ghost btn-sm text-start d-flex align-items-center ff-secondary fw-semibold gap-2">
|
|
13
|
+
<div class="flex-grow-1">[[groups:details.pending]]</div>
|
|
14
|
+
<span component="group/pending/count" class="flex-shrink-0 text-xs lh-1" title="{group.pending.length}">{humanReadableNumber(group.pending.length)}</span>
|
|
15
|
+
</button>
|
|
16
|
+
|
|
17
|
+
<button data-bs-toggle="tab" data-bs-target="#groups-invited" class="btn btn-ghost btn-sm text-start d-flex align-items-center ff-secondary fw-semibold gap-2">
|
|
18
|
+
<div class="flex-grow-1">[[groups:details.invited]]</div>
|
|
19
|
+
<span component="group/invited/count" class="flex-shrink-0 text-xs lh-1" title="{group.invited.length}">{humanReadableNumber(group.invited.length)}</span>
|
|
20
|
+
</button>
|
|
21
|
+
|
|
22
|
+
<button data-bs-toggle="tab" data-bs-target="#groups-admin" class="btn btn-ghost btn-sm text-start d-flex align-items-center ff-secondary fw-semibold">
|
|
23
|
+
<div class="flex-grow-1">[[global:header.admin]]</div>
|
|
24
|
+
</button>
|
|
25
|
+
{{{ end }}}
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
{{{ if (brand:logo || (config.showSiteTitle || widgets.brand-header.length)) }}}
|
|
2
|
-
<div class="container-lg px-md-4 brand-container">
|
|
3
|
-
<div class="col-12 d-flex border-bottom pb-3 {{{ if config.theme.centerHeaderElements }}}justify-content-center{{{ end }}}">
|
|
4
|
-
{{{ if (brand:logo || config.showSiteTitle) }}}
|
|
5
|
-
<div component="brand/wrapper" class="d-flex align-items-center gap-3 p-2 rounded-1 align-content-stretch ">
|
|
6
|
-
{{{ if brand:logo }}}
|
|
7
|
-
<a component="brand/anchor" href="{{{ if brand:logo:url }}}{brand:logo:url}{{{ else }}}{relative_path}/{{{ end }}}" title="[[global:header.brand-logo]]">
|
|
8
|
-
<img component="brand/logo" alt="{{{ if brand:logo:alt }}}{brand:logo:alt}{{{ else }}}[[global:header.brand-logo]]{{{ end }}}" class="{brand:logo:display}" src="{brand:logo}?{config.cache-buster}" />
|
|
9
|
-
</a>
|
|
10
|
-
{{{ end }}}
|
|
11
|
-
|
|
12
|
-
{{{ if config.showSiteTitle }}}
|
|
13
|
-
<a component="siteTitle" class="text-truncate align-self-stretch align-items-center d-flex" href="{{{ if title:url }}}{title:url}{{{ else }}}{relative_path}/{{{ end }}}">
|
|
14
|
-
<h1 class="fs-6 fw-bold text-body mb-0">{config.siteTitle}</h1>
|
|
15
|
-
</a>
|
|
16
|
-
{{{ end }}}
|
|
17
|
-
</div>
|
|
18
|
-
{{{ end }}}
|
|
19
|
-
{{{ if widgets.brand-header.length }}}
|
|
20
|
-
<div data-widget-area="brand-header" class="flex-fill gap-3 p-2 align-self-center">
|
|
21
|
-
{{{each widgets.brand-header}}}
|
|
22
|
-
{{./html}}
|
|
23
|
-
{{{end}}}
|
|
24
|
-
</div>
|
|
25
|
-
{{{ end }}}
|
|
26
|
-
</div>
|
|
27
|
-
</div>
|
|
1
|
+
{{{ if (brand:logo || (config.showSiteTitle || widgets.brand-header.length)) }}}
|
|
2
|
+
<div class="container-lg px-md-4 brand-container">
|
|
3
|
+
<div class="col-12 d-flex border-bottom pb-3 {{{ if config.theme.centerHeaderElements }}}justify-content-center{{{ end }}}">
|
|
4
|
+
{{{ if (brand:logo || config.showSiteTitle) }}}
|
|
5
|
+
<div component="brand/wrapper" class="d-flex align-items-center gap-3 p-2 rounded-1 align-content-stretch ">
|
|
6
|
+
{{{ if brand:logo }}}
|
|
7
|
+
<a component="brand/anchor" href="{{{ if brand:logo:url }}}{brand:logo:url}{{{ else }}}{relative_path}/{{{ end }}}" title="[[global:header.brand-logo]]">
|
|
8
|
+
<img component="brand/logo" alt="{{{ if brand:logo:alt }}}{brand:logo:alt}{{{ else }}}[[global:header.brand-logo]]{{{ end }}}" class="{brand:logo:display}" src="{brand:logo}?{config.cache-buster}" />
|
|
9
|
+
</a>
|
|
10
|
+
{{{ end }}}
|
|
11
|
+
|
|
12
|
+
{{{ if config.showSiteTitle }}}
|
|
13
|
+
<a component="siteTitle" class="text-truncate align-self-stretch align-items-center d-flex" href="{{{ if title:url }}}{title:url}{{{ else }}}{relative_path}/{{{ end }}}">
|
|
14
|
+
<h1 class="fs-6 fw-bold text-body mb-0">{config.siteTitle}</h1>
|
|
15
|
+
</a>
|
|
16
|
+
{{{ end }}}
|
|
17
|
+
</div>
|
|
18
|
+
{{{ end }}}
|
|
19
|
+
{{{ if widgets.brand-header.length }}}
|
|
20
|
+
<div data-widget-area="brand-header" class="flex-fill gap-3 p-2 align-self-center">
|
|
21
|
+
{{{each widgets.brand-header}}}
|
|
22
|
+
{{./html}}
|
|
23
|
+
{{{end}}}
|
|
24
|
+
</div>
|
|
25
|
+
{{{ end }}}
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
28
|
{{{ end }}}
|
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
<div component="bottombar" class="bottombar d-flex flex-column d-lg-none fixed-bottom ff-secondary gap-1 align-items-center" style="bottom: 0px;">
|
|
2
|
-
|
|
3
|
-
<!-- IMPORT partials/topic/navigator-mobile.tpl -->
|
|
4
|
-
|
|
5
|
-
<div class="bottombar-nav p-2 text-dark bg-light d-flex justify-content-between align-items-center w-100">
|
|
6
|
-
<div class="bottombar-nav-left d-flex gap-3 align-items-center">
|
|
7
|
-
<div>
|
|
8
|
-
<a href="#" role="button" class="nav-link d-flex justify-content-between align-items-center position-relative" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
9
|
-
<span class="position-relative">
|
|
10
|
-
<i class="fa fa-fw fa-lg fa-bars"></i>
|
|
11
|
-
<span component="unread/count" data-unread-url="{unreadCount.unreadUrl}" class="position-absolute top-0 start-100 translate-middle badge rounded-1 bg-primary {{{ if !unreadCount.mobileUnread }}}hidden{{{ end }}}">{unreadCount.mobileUnread}</span>
|
|
12
|
-
</span>
|
|
13
|
-
</a>
|
|
14
|
-
<ul class="navigation-dropdown dropdown-menu" role="menu">
|
|
15
|
-
{{{ each navigation }}}
|
|
16
|
-
{{{ if displayMenuItem(@root, @index) }}}
|
|
17
|
-
<li class="nav-item {./class}{{{ if ./dropdown }}} dropend{{{ end }}}" title="{./title}">
|
|
18
|
-
<a class="nav-link navigation-link px-3 py-2 {{{ if ./dropdown }}}dropdown-toggle{{{ end }}}" {{{ if ./dropdown }}} href="#" role="button" data-bs-toggle="collapse" data-bs-target="#collapse-target-{@index}" onclick="event.stopPropagation();" {{{ else }}} href="{./route}"{{{ end }}} {{{ if ./id }}}id="{./id}"{{{ end }}}{{{ if ./targetBlank }}} target="_blank"{{{ end }}}>
|
|
19
|
-
<span class="d-inline-flex justify-content-between align-items-center w-100">
|
|
20
|
-
<span class="text-nowrap">
|
|
21
|
-
{{{ if ./iconClass }}}
|
|
22
|
-
<i class="fa fa-fw {./iconClass}" data-content="{./content}"></i>
|
|
23
|
-
{{{ end }}}
|
|
24
|
-
{{{ if ./text }}}<span class="nav-text px-2 fw-semibold">{./text}</span>{{{ end }}}
|
|
25
|
-
</span>
|
|
26
|
-
<span component="navigation/count" class="badge rounded-1 bg-primary {{{ if !./content }}}hidden{{{ end }}}">{./content}</span>
|
|
27
|
-
</span>
|
|
28
|
-
</a>
|
|
29
|
-
{{{ if ./dropdown }}}
|
|
30
|
-
<div class="ps-3">
|
|
31
|
-
<ul id="collapse-target-{@index}" class="collapse list-unstyled ps-3">
|
|
32
|
-
{./dropdownContent}
|
|
33
|
-
</ul>
|
|
34
|
-
</div>
|
|
35
|
-
{{{ end }}}
|
|
36
|
-
</li>
|
|
37
|
-
{{{ end }}}
|
|
38
|
-
{{{ end }}}
|
|
39
|
-
</ul>
|
|
40
|
-
</div>
|
|
41
|
-
</div>
|
|
42
|
-
<div class="bottombar-nav-right d-flex gap-3 align-items-center">
|
|
43
|
-
<div>
|
|
44
|
-
{{{ if config.loggedIn }}}
|
|
45
|
-
<ul id="logged-in-menu" class="list-unstyled d-flex align-items-center w-100 gap-3 mb-0">
|
|
46
|
-
{{{ if config.searchEnabled }}}
|
|
47
|
-
<li component="sidebar/search" class="nav-item m-0 search">
|
|
48
|
-
<!-- IMPORT partials/sidebar/search-mobile.tpl -->
|
|
49
|
-
</li>
|
|
50
|
-
{{{ end }}}
|
|
51
|
-
|
|
52
|
-
<li component="notifications" class="nav-item m-0 notifications">
|
|
53
|
-
<!-- IMPORT partials/sidebar/notifications.tpl -->
|
|
54
|
-
</li>
|
|
55
|
-
|
|
56
|
-
{{{ if canChat }}}
|
|
57
|
-
<li class="nav-item m-0 chats">
|
|
58
|
-
<!-- IMPORT partials/sidebar/chats.tpl -->
|
|
59
|
-
</li>
|
|
60
|
-
{{{ end }}}
|
|
61
|
-
|
|
62
|
-
<li component="sidebar/drafts" class="hidden nav-item m-0 drafts">
|
|
63
|
-
<!-- IMPORT partials/sidebar/drafts.tpl -->
|
|
64
|
-
</li>
|
|
65
|
-
|
|
66
|
-
<li id="user_label" class="nav-item m-0 usermenu">
|
|
67
|
-
<!-- IMPORT partials/sidebar/user-menu.tpl -->
|
|
68
|
-
</li>
|
|
69
|
-
</ul>
|
|
70
|
-
{{{ else }}}
|
|
71
|
-
<ul id="logged-out-menu" class="list-unstyled d-flex w-100 gap-3 mb-0 logged-out-menu">
|
|
72
|
-
{{{ if (config.searchEnabled && user.privileges.search:content) }}}
|
|
73
|
-
<li component="sidebar/search" class="nav-item mx-2 search">
|
|
74
|
-
<!-- IMPORT partials/sidebar/search-mobile.tpl -->
|
|
75
|
-
</li>
|
|
76
|
-
{{{ end }}}
|
|
77
|
-
|
|
78
|
-
{{{ if allowRegistration }}}
|
|
79
|
-
<li class="nav-item mx-2" title="[[global:register]]">
|
|
80
|
-
<a class="nav-link" href="{relative_path}/register">
|
|
81
|
-
<i class="fa fa-fw fa-user-plus"></i>
|
|
82
|
-
</a>
|
|
83
|
-
</li>
|
|
84
|
-
{{{ end }}}
|
|
85
|
-
|
|
86
|
-
<li class="nav-item mx-2" title="[[global:login]]">
|
|
87
|
-
<a class="nav-link" href="{relative_path}/login">
|
|
88
|
-
<i class="fa fa-fw fa-sign-in"></i>
|
|
89
|
-
</a>
|
|
90
|
-
</li>
|
|
91
|
-
</ul>
|
|
92
|
-
{{{ end }}}
|
|
93
|
-
</div>
|
|
94
|
-
</div>
|
|
95
|
-
</div>
|
|
1
|
+
<div component="bottombar" class="bottombar d-flex flex-column d-lg-none fixed-bottom ff-secondary gap-1 align-items-center" style="bottom: 0px;">
|
|
2
|
+
|
|
3
|
+
<!-- IMPORT partials/topic/navigator-mobile.tpl -->
|
|
4
|
+
|
|
5
|
+
<div class="bottombar-nav p-2 text-dark bg-light d-flex justify-content-between align-items-center w-100">
|
|
6
|
+
<div class="bottombar-nav-left d-flex gap-3 align-items-center">
|
|
7
|
+
<div>
|
|
8
|
+
<a href="#" role="button" class="nav-link d-flex justify-content-between align-items-center position-relative" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
9
|
+
<span class="position-relative">
|
|
10
|
+
<i class="fa fa-fw fa-lg fa-bars"></i>
|
|
11
|
+
<span component="unread/count" data-unread-url="{unreadCount.unreadUrl}" class="position-absolute top-0 start-100 translate-middle badge rounded-1 bg-primary {{{ if !unreadCount.mobileUnread }}}hidden{{{ end }}}">{unreadCount.mobileUnread}</span>
|
|
12
|
+
</span>
|
|
13
|
+
</a>
|
|
14
|
+
<ul class="navigation-dropdown dropdown-menu" role="menu">
|
|
15
|
+
{{{ each navigation }}}
|
|
16
|
+
{{{ if displayMenuItem(@root, @index) }}}
|
|
17
|
+
<li class="nav-item {./class}{{{ if ./dropdown }}} dropend{{{ end }}}" title="{./title}">
|
|
18
|
+
<a class="nav-link navigation-link px-3 py-2 {{{ if ./dropdown }}}dropdown-toggle{{{ end }}}" {{{ if ./dropdown }}} href="#" role="button" data-bs-toggle="collapse" data-bs-target="#collapse-target-{@index}" onclick="event.stopPropagation();" {{{ else }}} href="{./route}"{{{ end }}} {{{ if ./id }}}id="{./id}"{{{ end }}}{{{ if ./targetBlank }}} target="_blank"{{{ end }}}>
|
|
19
|
+
<span class="d-inline-flex justify-content-between align-items-center w-100">
|
|
20
|
+
<span class="text-nowrap">
|
|
21
|
+
{{{ if ./iconClass }}}
|
|
22
|
+
<i class="fa fa-fw {./iconClass}" data-content="{./content}"></i>
|
|
23
|
+
{{{ end }}}
|
|
24
|
+
{{{ if ./text }}}<span class="nav-text px-2 fw-semibold">{./text}</span>{{{ end }}}
|
|
25
|
+
</span>
|
|
26
|
+
<span component="navigation/count" class="badge rounded-1 bg-primary {{{ if !./content }}}hidden{{{ end }}}">{./content}</span>
|
|
27
|
+
</span>
|
|
28
|
+
</a>
|
|
29
|
+
{{{ if ./dropdown }}}
|
|
30
|
+
<div class="ps-3">
|
|
31
|
+
<ul id="collapse-target-{@index}" class="collapse list-unstyled ps-3">
|
|
32
|
+
{./dropdownContent}
|
|
33
|
+
</ul>
|
|
34
|
+
</div>
|
|
35
|
+
{{{ end }}}
|
|
36
|
+
</li>
|
|
37
|
+
{{{ end }}}
|
|
38
|
+
{{{ end }}}
|
|
39
|
+
</ul>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="bottombar-nav-right d-flex gap-3 align-items-center">
|
|
43
|
+
<div>
|
|
44
|
+
{{{ if config.loggedIn }}}
|
|
45
|
+
<ul id="logged-in-menu" class="list-unstyled d-flex align-items-center w-100 gap-3 mb-0">
|
|
46
|
+
{{{ if config.searchEnabled }}}
|
|
47
|
+
<li component="sidebar/search" class="nav-item m-0 search">
|
|
48
|
+
<!-- IMPORT partials/sidebar/search-mobile.tpl -->
|
|
49
|
+
</li>
|
|
50
|
+
{{{ end }}}
|
|
51
|
+
|
|
52
|
+
<li component="notifications" class="nav-item m-0 notifications">
|
|
53
|
+
<!-- IMPORT partials/sidebar/notifications.tpl -->
|
|
54
|
+
</li>
|
|
55
|
+
|
|
56
|
+
{{{ if canChat }}}
|
|
57
|
+
<li class="nav-item m-0 chats">
|
|
58
|
+
<!-- IMPORT partials/sidebar/chats.tpl -->
|
|
59
|
+
</li>
|
|
60
|
+
{{{ end }}}
|
|
61
|
+
|
|
62
|
+
<li component="sidebar/drafts" class="hidden nav-item m-0 drafts">
|
|
63
|
+
<!-- IMPORT partials/sidebar/drafts.tpl -->
|
|
64
|
+
</li>
|
|
65
|
+
|
|
66
|
+
<li id="user_label" class="nav-item m-0 usermenu">
|
|
67
|
+
<!-- IMPORT partials/sidebar/user-menu.tpl -->
|
|
68
|
+
</li>
|
|
69
|
+
</ul>
|
|
70
|
+
{{{ else }}}
|
|
71
|
+
<ul id="logged-out-menu" class="list-unstyled d-flex w-100 gap-3 mb-0 logged-out-menu">
|
|
72
|
+
{{{ if (config.searchEnabled && user.privileges.search:content) }}}
|
|
73
|
+
<li component="sidebar/search" class="nav-item mx-2 search">
|
|
74
|
+
<!-- IMPORT partials/sidebar/search-mobile.tpl -->
|
|
75
|
+
</li>
|
|
76
|
+
{{{ end }}}
|
|
77
|
+
|
|
78
|
+
{{{ if allowRegistration }}}
|
|
79
|
+
<li class="nav-item mx-2" title="[[global:register]]">
|
|
80
|
+
<a class="nav-link" href="{relative_path}/register">
|
|
81
|
+
<i class="fa fa-fw fa-user-plus"></i>
|
|
82
|
+
</a>
|
|
83
|
+
</li>
|
|
84
|
+
{{{ end }}}
|
|
85
|
+
|
|
86
|
+
<li class="nav-item mx-2" title="[[global:login]]">
|
|
87
|
+
<a class="nav-link" href="{relative_path}/login">
|
|
88
|
+
<i class="fa fa-fw fa-sign-in"></i>
|
|
89
|
+
</a>
|
|
90
|
+
</li>
|
|
91
|
+
</ul>
|
|
92
|
+
{{{ end }}}
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
96
|
</div>
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
{{{ if !notifications.length }}}
|
|
2
|
-
<div class="no-notifs text-center p-4 d-flex flex-column">
|
|
3
|
-
<div class="p-4"><i class="fa-solid fa-wind fs-2 text-muted"></i></div>
|
|
4
|
-
<div class="text-xs fw-semibold text-muted">[[notifications:no-notifs]]</div>
|
|
5
|
-
</div>
|
|
6
|
-
{{{ end }}}
|
|
7
|
-
|
|
8
|
-
{{{ each notifications }}}
|
|
9
|
-
<div class="{./readClass}" data-nid="{./nid}" data-path="{./path}" {{{ if ./pid }}}data-pid="{./pid}"{{{ end }}}{{{ if ./tid }}}data-tid="{./tid}"{{{ end }}}>
|
|
10
|
-
<div class="d-flex gap-1 justify-content-between">
|
|
11
|
-
<div class="btn btn-ghost btn-sm d-flex gap-2 flex-grow-1 text-start align-items-start">
|
|
12
|
-
<a class="flex-grow-0 flex-shrink-0" href="{{{ if ./user.userslug}}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">
|
|
13
|
-
{{{ if (./image && ./from) }}}
|
|
14
|
-
<img class="avatar avatar-rounded" style="--avatar-size: 32px;" src="{./image}" />
|
|
15
|
-
{{{ else }}}
|
|
16
|
-
{{{ if ./icon }}}
|
|
17
|
-
<div class="avatar avatar-rounded" style="--avatar-size: 32px;"><i class="text-secondary fa {./icon}"></i></div>
|
|
18
|
-
{{{ else }}}
|
|
19
|
-
<div class="avatar avatar-rounded" style="--avatar-size: 32px; background-color: {./user.icon:bgColor};">{./user.icon:text}</div>
|
|
20
|
-
{{{ end }}}
|
|
21
|
-
{{{ end }}}
|
|
22
|
-
</a>
|
|
23
|
-
|
|
24
|
-
<div class="d-flex flex-grow-1 flex-column align-items-start position-relative">
|
|
25
|
-
<a href="{./path}" class="text-decoration-none d-inline-block text-reset text-break text-sm ff-sans stretched-link" component="notifications/item/link">
|
|
26
|
-
{./bodyShort}
|
|
27
|
-
</a>
|
|
28
|
-
<div class="text-xs text-muted">{{{ if ./timeagoLong }}}{./timeagoLong}{{{ else }}}<span class="timeago" title="{./datetimeISO}"></span>{{{ end }}}</div>
|
|
29
|
-
</div>
|
|
30
|
-
</div>
|
|
31
|
-
<div>
|
|
32
|
-
{{{ if ./nid }}}
|
|
33
|
-
<button class="mark-read btn btn-ghost btn-sm d-flex align-items-center justify-content-center flex-grow-0 flex-shrink-0 p-1" style="width: 1.5rem; height: 1.5rem;">
|
|
34
|
-
<i class="unread fa fa-2xs fa-circle text-primary {{{ if ./read }}}hidden{{{ end }}}" aria-label="[[unread:mark-as-read]]"></i>
|
|
35
|
-
<i class="read fa fa-2xs fa-circle-o text-secondary {{{ if !./read }}}hidden{{{ end }}}" aria-label="[[unread:mark-as-unread]]"></i>
|
|
36
|
-
</button>
|
|
37
|
-
{{{ end }}}
|
|
38
|
-
</div>
|
|
39
|
-
</div>
|
|
40
|
-
</div>
|
|
41
|
-
{{{ if !@last }}}
|
|
42
|
-
<hr class="my-1" />
|
|
43
|
-
{{{ end }}}
|
|
44
|
-
{{{ end }}}
|
|
1
|
+
{{{ if !notifications.length }}}
|
|
2
|
+
<div class="no-notifs text-center p-4 d-flex flex-column">
|
|
3
|
+
<div class="p-4"><i class="fa-solid fa-wind fs-2 text-muted"></i></div>
|
|
4
|
+
<div class="text-xs fw-semibold text-muted">[[notifications:no-notifs]]</div>
|
|
5
|
+
</div>
|
|
6
|
+
{{{ end }}}
|
|
7
|
+
|
|
8
|
+
{{{ each notifications }}}
|
|
9
|
+
<div class="{./readClass}" data-nid="{./nid}" data-path="{./path}" {{{ if ./pid }}}data-pid="{./pid}"{{{ end }}}{{{ if ./tid }}}data-tid="{./tid}"{{{ end }}}>
|
|
10
|
+
<div class="d-flex gap-1 justify-content-between">
|
|
11
|
+
<div class="btn btn-ghost btn-sm d-flex gap-2 flex-grow-1 text-start align-items-start">
|
|
12
|
+
<a class="flex-grow-0 flex-shrink-0" href="{{{ if ./user.userslug}}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">
|
|
13
|
+
{{{ if (./image && ./from) }}}
|
|
14
|
+
<img class="avatar avatar-rounded" style="--avatar-size: 32px;" src="{./image}" />
|
|
15
|
+
{{{ else }}}
|
|
16
|
+
{{{ if ./icon }}}
|
|
17
|
+
<div class="avatar avatar-rounded" style="--avatar-size: 32px;"><i class="text-secondary fa {./icon}"></i></div>
|
|
18
|
+
{{{ else }}}
|
|
19
|
+
<div class="avatar avatar-rounded" style="--avatar-size: 32px; background-color: {./user.icon:bgColor};">{./user.icon:text}</div>
|
|
20
|
+
{{{ end }}}
|
|
21
|
+
{{{ end }}}
|
|
22
|
+
</a>
|
|
23
|
+
|
|
24
|
+
<div class="d-flex flex-grow-1 flex-column align-items-start position-relative">
|
|
25
|
+
<a href="{./path}" class="text-decoration-none d-inline-block text-reset text-break text-sm ff-sans stretched-link" component="notifications/item/link">
|
|
26
|
+
{./bodyShort}
|
|
27
|
+
</a>
|
|
28
|
+
<div class="text-xs text-muted">{{{ if ./timeagoLong }}}{./timeagoLong}{{{ else }}}<span class="timeago" title="{./datetimeISO}"></span>{{{ end }}}</div>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
<div>
|
|
32
|
+
{{{ if ./nid }}}
|
|
33
|
+
<button class="mark-read btn btn-ghost btn-sm d-flex align-items-center justify-content-center flex-grow-0 flex-shrink-0 p-1" style="width: 1.5rem; height: 1.5rem;">
|
|
34
|
+
<i class="unread fa fa-2xs fa-circle text-primary {{{ if ./read }}}hidden{{{ end }}}" aria-label="[[unread:mark-as-read]]"></i>
|
|
35
|
+
<i class="read fa fa-2xs fa-circle-o text-secondary {{{ if !./read }}}hidden{{{ end }}}" aria-label="[[unread:mark-as-unread]]"></i>
|
|
36
|
+
</button>
|
|
37
|
+
{{{ end }}}
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
{{{ if !@last }}}
|
|
42
|
+
<hr class="my-1" />
|
|
43
|
+
{{{ end }}}
|
|
44
|
+
{{{ end }}}
|