nodebb-theme-harmony 2.0.0-pre.9 → 2.0.1

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.
Files changed (163) hide show
  1. package/.eslintrc +3 -3
  2. package/README.md +22 -19
  3. package/lib/controllers.js +29 -29
  4. package/library.js +184 -190
  5. package/package.json +48 -48
  6. package/plugin.json +24 -25
  7. package/public/.eslintrc +3 -3
  8. package/public/admin.js +15 -15
  9. package/public/harmony.js +287 -287
  10. package/public/settings.js +31 -31
  11. package/renovate.json +6 -6
  12. package/scss/account.scss +27 -27
  13. package/scss/category.scss +3 -3
  14. package/scss/chats.scss +11 -11
  15. package/scss/common.scss +122 -128
  16. package/scss/fonts.scss +19 -19
  17. package/scss/groups.scss +22 -22
  18. package/scss/harmony.scss +24 -25
  19. package/scss/header.scss +15 -15
  20. package/scss/mixins.scss +183 -176
  21. package/scss/modals.scss +6 -6
  22. package/scss/modules/breadcrumbs.scss +15 -15
  23. package/scss/modules/cover.scss +102 -104
  24. package/scss/modules/filters.scss +7 -7
  25. package/scss/modules/nprogress.scss +80 -80
  26. package/scss/modules/paginator.scss +23 -23
  27. package/scss/modules/tags.scss +5 -5
  28. package/scss/modules/topic-navigator.scss +52 -52
  29. package/scss/modules/topics-list.scss +40 -40
  30. package/scss/modules/user-menu.scss +10 -10
  31. package/scss/overrides.scss +65 -61
  32. package/scss/sidebar.scss +188 -189
  33. package/scss/skins.scss +58 -49
  34. package/scss/status.scss +24 -24
  35. package/scss/topic.scss +130 -138
  36. package/templates/account/blocks.tpl +51 -40
  37. package/templates/account/categories.tpl +63 -63
  38. package/templates/account/consent.tpl +73 -73
  39. package/templates/account/edit/password.tpl +34 -34
  40. package/templates/account/edit/username.tpl +29 -30
  41. package/templates/account/edit.tpl +137 -122
  42. package/templates/account/followers.tpl +14 -14
  43. package/templates/account/following.tpl +15 -15
  44. package/templates/account/groups.tpl +15 -15
  45. package/templates/account/info.tpl +270 -201
  46. package/templates/account/posts.tpl +35 -35
  47. package/templates/account/profile.tpl +92 -95
  48. package/templates/account/read.tpl +1 -0
  49. package/templates/account/sessions.tpl +8 -8
  50. package/templates/account/settings.tpl +236 -236
  51. package/templates/account/shares.tpl +20 -0
  52. package/templates/account/tags.tpl +12 -12
  53. package/templates/account/theme.tpl +63 -63
  54. package/templates/account/topics.tpl +44 -43
  55. package/templates/account/uploads.tpl +37 -37
  56. package/templates/admin/plugins/harmony.tpl +57 -56
  57. package/templates/categories.tpl +29 -29
  58. package/templates/category.tpl +72 -72
  59. package/templates/footer.tpl +17 -17
  60. package/templates/groups/details.tpl +86 -86
  61. package/templates/groups/list.tpl +58 -56
  62. package/templates/groups/members.tpl +9 -9
  63. package/templates/header.tpl +45 -45
  64. package/templates/notifications.tpl +32 -32
  65. package/templates/partials/account/admin-menu.tpl +36 -36
  66. package/templates/partials/account/category-item.tpl +22 -22
  67. package/templates/partials/account/footer.tpl +2 -2
  68. package/templates/partials/account/header.tpl +98 -98
  69. package/templates/partials/account/session-list.tpl +18 -18
  70. package/templates/partials/account/sidebar-left.tpl +116 -102
  71. package/templates/partials/breadcrumbs-json-ld.tpl +16 -26
  72. package/templates/partials/breadcrumbs.tpl +12 -12
  73. package/templates/partials/buttons/newTopic.tpl +22 -22
  74. package/templates/partials/categories/item.tpl +56 -56
  75. package/templates/partials/categories/lastpost.tpl +24 -24
  76. package/templates/partials/categories/link.tpl +4 -4
  77. package/templates/partials/category/subcategory.tpl +18 -18
  78. package/templates/partials/category/tags.tpl +3 -3
  79. package/templates/partials/cookie-consent.tpl +6 -6
  80. package/templates/partials/groups/admin.tpl +95 -95
  81. package/templates/partials/groups/invited.tpl +32 -32
  82. package/templates/partials/groups/list.tpl +15 -15
  83. package/templates/partials/groups/memberlist.tpl +46 -46
  84. package/templates/partials/groups/pending.tpl +29 -29
  85. package/templates/partials/groups/sidebar-left.tpl +27 -27
  86. package/templates/partials/header/brand.tpl +27 -25
  87. package/templates/partials/mobile-footer.tpl +95 -98
  88. package/templates/partials/notifications_list.tpl +44 -44
  89. package/templates/partials/paginator.tpl +46 -46
  90. package/templates/partials/post_bar.tpl +27 -29
  91. package/templates/partials/posts_list.tpl +7 -7
  92. package/templates/partials/posts_list_item.tpl +19 -19
  93. package/templates/partials/quick-search-results.tpl +46 -46
  94. package/templates/partials/search-filters.tpl +183 -183
  95. package/templates/partials/search-results.tpl +54 -54
  96. package/templates/partials/sidebar/chats.tpl +45 -45
  97. package/templates/partials/sidebar/drafts.tpl +63 -63
  98. package/templates/partials/sidebar/logged-in-menu.tpl +22 -22
  99. package/templates/partials/sidebar/logged-out-menu.tpl +44 -44
  100. package/templates/partials/sidebar/notifications.tpl +49 -49
  101. package/templates/partials/sidebar/search-mobile.tpl +28 -28
  102. package/templates/partials/sidebar/search.tpl +30 -30
  103. package/templates/partials/sidebar/user-menu.tpl +103 -103
  104. package/templates/partials/sidebar-left.tpl +39 -42
  105. package/templates/partials/sidebar-right.tpl +16 -16
  106. package/templates/partials/skin-switcher.tpl +50 -50
  107. package/templates/partials/tags_list.tpl +7 -5
  108. package/templates/partials/toast.tpl +19 -19
  109. package/templates/partials/topic/event.tpl +12 -12
  110. package/templates/partials/topic/navigation-post.tpl +9 -9
  111. package/templates/partials/topic/navigator-mobile.tpl +61 -61
  112. package/templates/partials/topic/navigator.tpl +26 -26
  113. package/templates/partials/topic/necro-post.tpl +5 -5
  114. package/templates/partials/topic/post-menu-list.tpl +156 -140
  115. package/templates/partials/topic/post-menu.tpl +4 -30
  116. package/templates/partials/topic/post-placeholder.tpl +14 -14
  117. package/templates/partials/topic/post.tpl +146 -139
  118. package/templates/partials/topic/quickreply.tpl +28 -28
  119. package/templates/partials/topic/reply-button.tpl +26 -24
  120. package/templates/partials/topic/selection-tooltip.tpl +2 -2
  121. package/templates/partials/topic/sort.tpl +27 -27
  122. package/templates/partials/topic/stats.tpl +14 -14
  123. package/templates/partials/topic/thumbs.tpl +4 -4
  124. package/templates/partials/topic/tools.tpl +8 -12
  125. package/templates/partials/topic/topic-menu-list.tpl +73 -73
  126. package/templates/partials/topic/watch.tpl +59 -59
  127. package/templates/partials/topic-filters.tpl +15 -15
  128. package/templates/partials/topic-list-bar.tpl +54 -54
  129. package/templates/partials/topic-terms.tpl +15 -15
  130. package/templates/partials/topics_list.tpl +131 -123
  131. package/templates/partials/users/item.tpl +39 -37
  132. package/templates/partials/users_list.tpl +4 -4
  133. package/templates/partials/users_list_menu.tpl +14 -14
  134. package/templates/popular.tpl +34 -34
  135. package/templates/post-queue.tpl +211 -207
  136. package/templates/recent.tpl +42 -35
  137. package/templates/search.tpl +46 -46
  138. package/templates/tag.tpl +34 -34
  139. package/templates/tags.tpl +49 -49
  140. package/templates/top.tpl +34 -34
  141. package/templates/topic.tpl +123 -130
  142. package/templates/unread.tpl +31 -31
  143. package/templates/users.tpl +39 -39
  144. package/templates/world.tpl +66 -35
  145. package/theme.json +6 -6
  146. package/package-lock.json +0 -2368
  147. package/scss/modules/bottom-sheet.scss +0 -52
  148. package/templates/flags/detail.tpl +0 -179
  149. package/templates/flags/list.tpl +0 -6
  150. package/templates/login.tpl +0 -102
  151. package/templates/partials/category/filter-dropdown-content.tpl +0 -41
  152. package/templates/partials/category/selector-dropdown-content.tpl +0 -39
  153. package/templates/partials/category/sort.tpl +0 -39
  154. package/templates/partials/category/tools.tpl +0 -89
  155. package/templates/partials/category/watch.tpl +0 -67
  156. package/templates/partials/flags/bulk-actions.tpl +0 -9
  157. package/templates/partials/flags/filters.tpl +0 -189
  158. package/templates/partials/flags/results.tpl +0 -38
  159. package/templates/partials/groups/filter-dropdown-content.tpl +0 -25
  160. package/templates/partials/tags/filter-dropdown-content.tpl +0 -38
  161. package/templates/partials/tags/watch.tpl +0 -42
  162. package/templates/partials/users/filter-dropdown-content.tpl +0 -23
  163. package/templates/register.tpl +0 -104
@@ -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 class="">
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-ghost 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-ghost ff-secondary fw-semibold">
7
- <div class="flex-grow-1">[[groups:members]]</div>
8
- <span component="group/member/count" class="flex-shrink-0 text-xs" 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-ghost ff-secondary fw-semibold">
13
- <div class="flex-grow-1">[[groups:details.pending]]</div>
14
- <span component="group/pending/count" class="flex-shrink-0 text-xs" 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-ghost ff-secondary fw-semibold">
18
- <div class="flex-grow-1">[[groups:details.invited]]</div>
19
- <span component="group/invited/count" class="flex-shrink-0 text-xs" 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-ghost 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,26 +1,28 @@
1
- {{{ if (brand:logo || config.showSiteTitle)}}}
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
- <div component="brand/wrapper" class="d-flex align-items-center gap-3 p-2 rounded-1 align-content-stretch ">
5
- {{{ if brand:logo }}}
6
- <a component="brand/anchor" href="{{{ if brand:logo:url }}}{brand:logo:url}{{{ else }}}{relative_path}/{{{ end }}}" title="[[global:header.brand-logo]]">
7
- <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}" />
8
- </a>
9
- {{{ end }}}
10
-
11
- {{{ if config.showSiteTitle }}}
12
- <a component="siteTitle" class="text-truncate align-self-stretch align-items-center d-flex" href="{{{ if title:url }}}{title:url}{{{ else }}}{relative_path}/{{{ end }}}">
13
- <h1 class="fs-6 fw-bold text-body mb-0">{config.siteTitle}</h1>
14
- </a>
15
- {{{ end }}}
16
- </div>
17
- {{{ if widgets.brand-header.length }}}
18
- <div data-widget-area="brand-header" class="flex-fill gap-3 p-2 align-self-center">
19
- {{{each widgets.brand-header}}}
20
- {{./html}}
21
- {{{end}}}
22
- </div>
23
- {{{ end }}}
24
- </div>
25
- </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>
26
28
  {{{ end }}}
@@ -1,99 +1,96 @@
1
- <div component="bottombar" class="bottombar d-flex flex-column d-lg-none fixed-bottom ff-secondary gap-1 align-items-center">
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 }}}"
19
- {{{ 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 }}}>
20
- <span class="d-inline-flex justify-content-between align-items-center w-100">
21
- <span class="text-nowrap">
22
- {{{ if ./iconClass }}}
23
- <i class="fa fa-fw {./iconClass}" data-content="{./content}"></i>
24
- {{{ end }}}
25
- {{{ if ./text }}}
26
- <span class="nav-text px-2 fw-semibold">{./text}</span>
27
- {{{ end }}}
28
- </span>
29
- <span component="navigation/count" class="badge rounded-1 bg-primary {{{ if !./content }}}hidden{{{ end }}}">{./content}</span>
30
- </span>
31
- </a>
32
- {{{ if ./dropdown }}}
33
- <div class="ps-3">
34
- <ul id="collapse-target-{@index}" class="collapse list-unstyled ps-3">
35
- {./dropdownContent}
36
- </ul>
37
- </div>
38
- {{{ end }}}
39
- </li>
40
- {{{ end }}}
41
- {{{ end }}}
42
- </ul>
43
- </div>
44
- </div>
45
- <div class="bottombar-nav-right d-flex gap-3 align-items-center">
46
- <div>
47
- {{{ if config.loggedIn }}}
48
- <ul id="logged-in-menu" class="list-unstyled d-flex align-items-center w-100 gap-3 mb-0">
49
- {{{ if config.searchEnabled }}}
50
- <li component="sidebar/search" class="nav-item m-0 search">
51
- <!-- IMPORT partials/sidebar/search-mobile.tpl -->
52
- </li>
53
- {{{ end }}}
54
-
55
- <li component="notifications" class="nav-item m-0 notifications">
56
- <!-- IMPORT partials/sidebar/notifications.tpl -->
57
- </li>
58
-
59
- {{{ if canChat }}}
60
- <li class="nav-item m-0 chats">
61
- <!-- IMPORT partials/sidebar/chats.tpl -->
62
- </li>
63
- {{{ end }}}
64
-
65
- <li component="sidebar/drafts" class="hidden nav-item m-0 drafts">
66
- <!-- IMPORT partials/sidebar/drafts.tpl -->
67
- </li>
68
-
69
- <li id="user_label" class="nav-item m-0 usermenu">
70
- <!-- IMPORT partials/sidebar/user-menu.tpl -->
71
- </li>
72
- </ul>
73
- {{{ else }}}
74
- <ul id="logged-out-menu" class="list-unstyled d-flex w-100 gap-3 mb-0 logged-out-menu">
75
- {{{ if (config.searchEnabled && user.privileges.search:content) }}}
76
- <li component="sidebar/search" class="nav-item mx-2 search">
77
- <!-- IMPORT partials/sidebar/search-mobile.tpl -->
78
- </li>
79
- {{{ end }}}
80
-
81
- {{{ if allowRegistration }}}
82
- <li class="nav-item mx-2" title="[[global:register]]">
83
- <a class="nav-link" href="{relative_path}/register">
84
- <i class="fa fa-fw fa-user-plus"></i>
85
- </a>
86
- </li>
87
- {{{ end }}}
88
-
89
- <li class="nav-item mx-2" title="[[global:login]]">
90
- <a class="nav-link" href="{relative_path}/login">
91
- <i class="fa fa-fw fa-sign-in"></i>
92
- </a>
93
- </li>
94
- </ul>
95
- {{{ end }}}
96
- </div>
97
- </div>
98
- </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>
99
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-ghost-sm d-flex gap-2 flex-grow-1 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-ghost-sm 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 }}}