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,98 +1,98 @@
1
- <div class="account w-100 mx-auto">
2
- <div data-widget-area="header">
3
- {{{each widgets.header}}}
4
- {{widgets.header.html}}
5
- {{{end}}}
6
- </div>
7
-
8
- <div class="cover position-absolute start-0 top-0 w-100" component="account/cover" style="background-image: url({cover:url}); background-position: {cover:position};">
9
- <div class="container">
10
- {{{ if allowCoverPicture }}}
11
- {{{ if canEdit }}}
12
- <div class="controls text-center">
13
- <span class="upload p-2 m-2 rounded-1 text-bg-light opacity-75"><i class="fa fa-fw fa-upload"></i></span>
14
- <span class="resize p-2 m-2 rounded-1 text-bg-light opacity-75"><i class="fa fa-fw fa-arrows"></i></span>
15
- <span class="remove p-2 m-2 rounded-1 text-bg-light opacity-75"><i class="fa fa-fw fa-times"></i></span>
16
- </div>
17
- <div class="save text-bg-primary">[[groups:cover-save]] <i class="fa fa-fw fa-floppy-o"></i></div>
18
- <div class="indicator text-bg-primary">[[groups:cover-saving]] <i class="fa fa-fw fa-refresh fa-spin"></i></div>
19
- {{{ end }}}
20
- {{{ end }}}
21
- </div>
22
- </div>
23
-
24
- <div class="d-flex flex-column flex-md-row gap-2 w-100 pb-4 mb-4 mt-2 border-bottom">
25
- <div {{{ if (allowProfilePicture && isSelfOrAdminOrGlobalModerator)}}}component="profile/change/picture"{{{ end }}} class="avatar-wrapper border border-white border-4 rounded-circle position-relative align-self-center align-self-md-start hover-parent" style="margin-top: -75px;">
26
- {buildAvatar(@value, "142px", true)}
27
- {{{ if (allowProfilePicture && isSelfOrAdminOrGlobalModerator)}}}
28
- <div component="profile/change/picture" class="d-none d-md-block pointer p-2 rounded-1 opacity-75 text-bg-light position-absolute top-50 start-50 translate-middle hover-visible">
29
- <span class="upload"><i class="fa fa-fw fa-upload"></i></span>
30
- </div>
31
- {{{ end }}}
32
- </div>
33
-
34
- <div class="d-flex flex-column flex-md-row mt-1 justify-content-between w-100 gap-2">
35
- <div class="d-flex flex-grow-1 flex-row gap-2">
36
- <div class="d-flex flex-column gap-1">
37
- <h2 class="fullname fw-semibold fs-2 tracking-tight mb-0">{{{ if fullname }}}{fullname}{{{ else }}}{username}{{{ end }}}</h2>
38
- <div class="d-flex flex-wrap gap-1 text-sm align-items-center">
39
- <span class="username fw-bold">{{{ if !banned }}}@{username}{{{ else }}}[[user:banned]]{{{ end }}}</span>
40
- <div class="d-flex align-items-center gap-1 p-1">
41
- {{{ if selectedGroup.length }}}
42
- {{{ each selectedGroup }}}
43
- {{{ if ./slug }}}
44
- <!-- IMPORT partials/groups/badge.tpl -->
45
- {{{ end }}}
46
- {{{ end }}}
47
- {{{ end }}}
48
- </div>
49
- </div>
50
- <div class="d-flex gap-2" component="user/badges"></div>
51
- {{{ if isAdminOrGlobalModeratorOrModerator }}}
52
- {{{ if banned }}}
53
- <div class="text-xm text-muted">
54
- {{{ if banned_until }}}
55
- [[user:info.banned-until, {banned_until_readable}]]
56
- {{{ else }}}
57
- [[user:info.banned-permanently]]
58
- {{{ end }}}
59
- </div>
60
- {{{ end }}}
61
- {{{ end }}}
62
- </div>
63
- </div>
64
-
65
- <div class="flex-shrink-0 d-flex gap-1 align-self-stretch align-self-md-start justify-content-end">
66
- {{{ if loggedIn }}}
67
- {{{ if !isSelf }}}
68
- <a component="account/unfollow" href="#" class="btn btn-info flex-fill{{{ if !isFollowing }}} hide{{{ end }}}">[[user:unfollow]]</a>
69
- <a component="account/follow" href="#" class="btn btn-primary flex-fill{{{ if isFollowing }}} hide{{{ end }}}">[[user:follow]]</a>
70
- {{{ end }}}
71
- {{{ end }}}
72
-
73
- {{{ if (canChat && !banned) }}}
74
- <div class="btn-group flex-fill">
75
- <a {{{ if hasPrivateChat }}}component="account/chat"{{{ else }}}component="account/new-chat"{{{ end }}} href="#" class="btn btn-light" role="button">[[user:chat]]</a>
76
- {{{ if hasPrivateChat}}}
77
- <button type="button" class="btn btn-light dropdown-toggle flex-0" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
78
- <i class="fa fa-caret-down"></i>
79
- </button>
80
- <ul class="dropdown-menu dropdown-menu-end p-1 text-sm" role="menu">
81
- <li><a class="dropdown-item rounded-1" href="#" component="account/new-chat" role="menuitem"s>[[user:new-chat-with, {username}]]</a></li>
82
- </ul>
83
- {{{ end }}}
84
- </div>
85
- {{{ end }}}
86
- {{{ if !isSelf }}}
87
- {{{ if (isAdmin || (canBan || canMute ))}}}
88
- <!-- IMPORT partials/account/admin-menu.tpl -->
89
- {{{ end }}}
90
- {{{ end }}}
91
- </div>
92
- </div>
93
- </div>
94
-
95
- <div class="d-flex flex-column flex-md-row">
96
- <!-- IMPORT partials/account/sidebar-left.tpl -->
97
- <div class="account-content flex-grow-1 ps-md-2 ps-lg-3 ps-xl-4" style="min-width: 0;">
98
-
1
+ <div class="account w-100 mx-auto">
2
+ <div class="cover position-absolute start-0 top-0 w-100" component="account/cover" style="background-image: url({cover:url}); background-position: {cover:position};">
3
+ <div class="container">
4
+ {{{ if allowCoverPicture }}}
5
+ {{{ if canEdit }}}
6
+ <div class="controls text-center">
7
+ <a href="#" class="upload p-2 m-2 rounded-1 text-bg-light opacity-75"><i class="fa fa-fw fa-upload"></i></a>
8
+ <a href="#" class="resize p-2 m-2 rounded-1 text-bg-light opacity-75"><i class="fa fa-fw fa-arrows"></i></a>
9
+ <a href="#" class="remove p-2 m-2 rounded-1 text-bg-light opacity-75"><i class="fa fa-fw fa-times"></i></a>
10
+ </div>
11
+ <a href="#" class="save text-bg-primary">[[groups:cover-save]] <i class="fa fa-fw fa-floppy-o"></i></a>
12
+ <div class="indicator text-bg-primary">[[groups:cover-saving]] <i class="fa fa-fw fa-refresh fa-spin"></i></div>
13
+ {{{ end }}}
14
+ {{{ end }}}
15
+ </div>
16
+ </div>
17
+
18
+ <div class="d-flex flex-column flex-md-row gap-2 w-100 pb-4 mb-4 mt-2 border-bottom">
19
+ <div {{{ if (allowProfilePicture && isSelfOrAdminOrGlobalModerator)}}}component="profile/change/picture"{{{ end }}} class="avatar-wrapper border border-white border-4 rounded-circle position-relative align-self-center align-self-md-start hover-parent" style="margin-top: -75px;">
20
+ {buildAvatar(@value, "142px", true)}
21
+ {{{ if (allowProfilePicture && isSelfOrAdminOrGlobalModerator)}}}
22
+ <a href="#" component="profile/change/picture" class="d-none d-md-block pointer p-2 rounded-1 text-bg-light position-absolute top-50 start-50 translate-middle hover-opacity-75">
23
+ <span class="upload"><i class="fa fa-fw fa-upload"></i></span>
24
+ </a>
25
+ {{{ end }}}
26
+ </div>
27
+
28
+ <div class="d-flex flex-column flex-md-row mt-1 justify-content-between w-100 gap-2">
29
+ <div class="d-flex flex-grow-1 flex-row gap-2">
30
+ <div class="d-flex flex-column gap-1">
31
+ <h2 class="fullname fw-semibold fs-2 tracking-tight mb-0">{{{ if fullname }}}{fullname}{{{ else }}}{username}{{{ end }}}</h2>
32
+ <div class="d-flex flex-wrap gap-1 text-sm align-items-center">
33
+ <span class="username fw-bold">{{{ if !banned }}}@{username}{{{ else }}}[[user:banned]]{{{ end }}}</span>
34
+ <div class="d-flex align-items-center gap-1 p-1 flex-wrap">
35
+ {{{ if selectedGroup.length }}}
36
+ {{{ each selectedGroup }}}
37
+ {{{ if ./slug }}}
38
+ <!-- IMPORT partials/groups/badge.tpl -->
39
+ {{{ end }}}
40
+ {{{ end }}}
41
+ {{{ end }}}
42
+ </div>
43
+ </div>
44
+ <div class="d-flex gap-2" component="user/badges"></div>
45
+ {{{ if isAdminOrGlobalModeratorOrModerator }}}
46
+ {{{ if banned }}}
47
+ <div class="text-xm text-muted">
48
+ {{{ if banned_until }}}
49
+ [[user:info.banned-until, {banned_until_readable}]]
50
+ {{{ else }}}
51
+ [[user:info.banned-permanently]]
52
+ {{{ end }}}
53
+ </div>
54
+ {{{ end }}}
55
+ {{{ end }}}
56
+ </div>
57
+ </div>
58
+
59
+ <div class="flex-shrink-0 d-flex gap-1 align-self-stretch align-self-md-start justify-content-end">
60
+ {{{ if loggedIn }}}
61
+ {{{ if !isSelf }}}
62
+ <a component="account/unfollow" href="#" class="btn btn-outline-warning flex-fill{{{ if (!isFollowing && !isFollowPending) }}} hide{{{ end }}}">[[user:{{{ if isFollowPending }}}cancel-follow{{{ else }}}unfollow{{{ end }}}]]</a>
63
+ <a component="account/follow" href="#" class="btn btn-primary flex-fill{{{ if (isFollowing || isFollowPending) }}} hide{{{ end }}}">[[user:follow]]</a>
64
+ {{{ end }}}
65
+ {{{ end }}}
66
+
67
+ {{{ if (canChat && !banned) }}}
68
+ <div class="btn-group flex-fill">
69
+ <a {{{ if hasPrivateChat }}}component="account/chat"{{{ else }}}component="account/new-chat"{{{ end }}} href="#" class="btn btn-light" role="button">[[user:chat]]</a>
70
+ {{{ if hasPrivateChat}}}
71
+ <button type="button" class="btn btn-light dropdown-toggle flex-0" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
72
+ <i class="fa fa-caret-down"></i>
73
+ </button>
74
+ <ul class="dropdown-menu dropdown-menu-end p-1 text-sm" role="menu">
75
+ <li><a class="dropdown-item rounded-1" href="#" component="account/new-chat" role="menuitem"s>[[user:new-chat-with, {username}]]</a></li>
76
+ </ul>
77
+ {{{ end }}}
78
+ </div>
79
+ {{{ end }}}
80
+ {{{ if !isSelf }}}
81
+ {{{ if (isAdmin || (canBan || canMute ))}}}
82
+ <!-- IMPORT partials/account/admin-menu.tpl -->
83
+ {{{ end }}}
84
+ {{{ end }}}
85
+ </div>
86
+ </div>
87
+ </div>
88
+
89
+ <div data-widget-area="header">
90
+ {{{each widgets.header}}}
91
+ {{widgets.header.html}}
92
+ {{{end}}}
93
+ </div>
94
+
95
+ <div class="d-flex flex-column flex-md-row">
96
+ <!-- IMPORT partials/account/sidebar-left.tpl -->
97
+ <div class="account-content flex-grow-1 ps-md-2 ps-lg-3 ps-xl-4" style="min-width: 0;">
98
+
@@ -1,18 +1,18 @@
1
- {{{ each sessions }}}
2
- <li class="list-group-item text-break" data-uuid="{./uuid}">
3
- <div class="float-end">
4
- {{{ if isSelfOrAdminOrGlobalModerator }}}
5
- {{{ if !./current }}}
6
- <button class="btn btn-sm btn-outline-secondary" type="button" data-action="revokeSession">[[user:revoke-session]]</button>
7
- {{{ end }}}
8
- {{{ end }}}
9
- {function.userAgentIcons}
10
- <i class="fa fa-circle text-{{{ if ./current }}}success{{{ else }}}muted{{{ end }}}"></i>
11
- </div>
12
- [[user:browser-version-on-platform, {./browser}, {./version}, {./platform}]]<br />
13
- <small class="timeago text-muted" title="{../datetimeISO}"></small>
14
- <ul>
15
- <li><strong>[[global:ip-address]]</strong>: {../ip}</li>
16
- </ul>
17
- </li>
18
- {{{ end }}}
1
+ {{{ each sessions }}}
2
+ <li class="list-group-item text-break" data-uuid="{./uuid}">
3
+ <div class="float-end">
4
+ {{{ if isSelfOrAdminOrGlobalModerator }}}
5
+ {{{ if !./current }}}
6
+ <button class="btn btn-sm btn-outline-secondary" type="button" data-action="revokeSession">[[user:revoke-session]]</button>
7
+ {{{ end }}}
8
+ {{{ end }}}
9
+ {function.userAgentIcons}
10
+ <i class="fa fa-circle text-{{{ if ./current }}}success{{{ else }}}muted{{{ end }}}"></i>
11
+ </div>
12
+ [[user:browser-version-on-platform, {./browser}, {./version}, {./platform}]]<br />
13
+ <small class="timeago text-muted" title="{../datetimeISO}"></small>
14
+ <ul>
15
+ <li><strong>[[global:ip-address]]</strong>: {../ip}</li>
16
+ </ul>
17
+ </li>
18
+ {{{ end }}}
@@ -1,102 +1,116 @@
1
- <div class="flex-shrink-0 pe-2 border-end-md text-sm mb-3 flex-basis-md-200">
2
- <div class="sticky-md-top d-flex flex-row flex-md-column flex-wrap gap-1" style="top: 1rem;z-index: 1;">
3
- <a href="{config.relative_path}/user/{userslug}" class="btn-ghost ff-secondary fw-semibold {{{ if template.account/profile }}}active{{{ end }}}">
4
- <div class="flex-grow-1">[[global:about]]</div>
5
- </a>
6
- <a href="{config.relative_path}/user/{userslug}/posts"class="btn-ghost ff-secondary fw-semibold
7
- {{{ if template.account/posts }}}active{{{ end }}}
8
- {{{ if template.account/best }}}active{{{ end }}}
9
- {{{ if template.account/controversial }}}active{{{ end }}}
10
- {{{ if template.account/upvoted }}}active{{{ end }}}
11
- {{{ if template.account/downvoted }}}active{{{ end }}}
12
- {{{ if template.account/bookmarks }}}active{{{ end }}}">
13
- <div class="flex-grow-1">[[global:posts]]</div>
14
- <span class="flex-shrink-0 text-xs" title="{counts.posts}">{humanReadableNumber(counts.posts)}</span>
15
- </a>
16
- <a href="{config.relative_path}/user/{userslug}/topics" class="btn-ghost ff-secondary fw-semibold
17
- {{{ if template.account/topics }}}active{{{ end }}}
18
- {{{ if template.account/watched }}}active{{{ end }}}
19
- {{{ if template.account/ignored }}}active{{{ end }}}">
20
- <div class="flex-grow-1">[[global:topics]]</div>
21
- <span class="flex-shrink-0 text-xs" title="{counts.topics}">{humanReadableNumber(counts.topics)}</span>
22
- </a>
23
- <a href="{config.relative_path}/user/{userslug}/groups" class="btn-ghost ff-secondary fw-semibold
24
- {{{ if template.account/groups }}}active{{{ end }}}">
25
- <div class="flex-grow-1">[[global:header.groups]]</div>
26
- <span class="flex-shrink-0 text-xs" title="{counts.groups}">{humanReadableNumber(counts.groups)}</span>
27
- </a>
28
-
29
- <a href="{config.relative_path}/user/{userslug}/followers" class="btn-ghost ff-secondary fw-semibold
30
- {{{ if template.account/followers }}}active{{{ end }}}">
31
- <div class="flex-grow-1">[[user:followers]]</div>
32
- <span class="flex-shrink-0 text-xs" title="{counts.followers}">{humanReadableNumber(counts.followers)}</span>
33
- </a>
34
-
35
- <a href="{config.relative_path}/user/{userslug}/following" class="btn-ghost ff-secondary fw-semibold
36
- {{{ if template.account/following }}}active{{{ end }}}">
37
- <div class="flex-grow-1">[[user:following]]</div>
38
- <span class="flex-shrink-0 text-xs" title="{counts.following}">{humanReadableNumber(counts.following)}</span>
39
- </a>
40
-
41
- {{{ if canEdit }}}
42
- <a href="{config.relative_path}/user/{userslug}/categories" class="btn-ghost ff-secondary fw-semibold
43
- {{{ if template.account/categories }}}active{{{ end }}}">
44
- <div class="flex-grow-1">[[user:watched-categories]]</div>
45
- <span class="flex-shrink-0 text-xs" title="{counts.categoriesWatched}">{counts.categoriesWatched}</span>
46
- </a>
47
- {{{ if isSelf }}}
48
- <a href="{config.relative_path}/user/{userslug}/tags" class="btn-ghost ff-secondary fw-semibold
49
- {{{ if template.account/tags }}}active{{{ end }}}">
50
- <div class="flex-grow-1">[[user:watched-tags]]</div>
51
- <span class="flex-shrink-0 text-xs" title="{counts.tagsWatched}">{counts.tagsWatched}</span>
52
- </a>
53
- {{{ end }}}
54
-
55
- <a href="{config.relative_path}/user/{userslug}/blocks" class="btn-ghost ff-secondary fw-semibold
56
- {{{ if template.account/blocks }}}active{{{ end }}}">
57
- <div class="flex-grow-1">[[user:blocked-users]]</div>
58
- <span class="flex-shrink-0 text-xs" title="{counts.blocks}">{humanReadableNumber(counts.blocks)}</span>
59
- </a>
60
-
61
- <a href="{config.relative_path}/user/{userslug}/uploads" class="btn-ghost ff-secondary fw-semibold
62
- {{{ if template.account/uploads }}}active{{{ end }}}">
63
- <div class="flex-grow-1">[[global:uploads]]</div>
64
- <span class="flex-shrink-0 text-xs" title="{counts.uploaded}">{humanReadableNumber(counts.uploaded)}</span>
65
- </a>
66
- {{{ end }}}
67
-
68
- {{{ if (loggedIn && (!isSelf && !banned)) }}}
69
- <hr class="w-100 my-2"/>
70
- <a href="#" component="account/flag" class="btn-ghost-sm ff-secondary">
71
- <i class="flex-shrink-0 fa-solid fa-flag text-danger"></i>
72
- <div class="flex-grow-1 text-nowrap">[[user:flag-profile]]</div>
73
- </a>
74
- <a href="#" component="account/block" class="btn-ghost-sm ff-secondary {{{ if isBlocked }}}hidden{{{ end }}}">
75
- <i class="flex-shrink-0 fa-solid fa-ban text-danger"></i>
76
- <div class="flex-grow-1 text-nowrap">[[user:block-user]]</div>
77
- </a>
78
- <a href="#" component="account/unblock" class="btn-ghost-sm ff-secondary {{{ if !isBlocked }}}hidden{{{ end }}}">
79
- <i class="flex-shrink-0 fa-solid fa-ban text-danger"></i>
80
- <div class="flex-grow-1 text-nowrap">[[user:unblock-user]]</div>
81
- </a>
82
- {{{ end }}}
83
-
84
- {{{ if canEdit }}}
85
- <hr class="w-100 my-2"/>
86
- <a href="{config.relative_path}/user/{userslug}/edit" class="btn-ghost-sm ff-secondary text-xs
87
- {{{ if template.account/edit }}}active{{{ end }}}">
88
- <div class="flex-grow-1">[[user:edit-profile]]</div>
89
- </a>
90
- <a href="{config.relative_path}/user/{userslug}/settings" class="btn-ghost-sm ff-secondary text-xs
91
- {{{ if template.account/settings }}}active{{{ end }}}">
92
- <div class="flex-grow-1">[[user:settings]]</div>
93
- </a>
94
- {{{ end }}}
95
-
96
- {{{ each profile_links }}}
97
- <a href="{config.relative_path}/user/{userslug}/{./route}" class="btn-ghost-sm ff-secondary text-xs plugin-link {{{ if ./public }}}public{{{ else }}}private{{{ end }}} {{{ if (url == ./url) }}}active{{{ end }}}" id="{./id}">
98
- <div class="flex-grow-1">{./name}</div>
99
- </a>
100
- {{{end}}}
101
- </div>
102
- </div>
1
+ <div class="flex-shrink-0 pe-2 border-end-md text-sm mb-3 flex-basis-md-200">
2
+ <div class="sticky-md-top d-flex flex-row flex-md-column flex-wrap gap-1" style="top: 1rem;z-index: 1;">
3
+ <a href="{config.relative_path}/user/{userslug}" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold {{{ if template.account/profile }}}active{{{ end }}}">
4
+ <div class="flex-grow-1">[[global:about]]</div>
5
+ </a>
6
+
7
+ <a href="{config.relative_path}/user/{userslug}/posts"class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
8
+ {{{ if template.account/posts }}}active{{{ end }}}
9
+ {{{ if template.account/best }}}active{{{ end }}}
10
+ {{{ if template.account/controversial }}}active{{{ end }}}
11
+ {{{ if template.account/upvoted }}}active{{{ end }}}
12
+ {{{ if template.account/downvoted }}}active{{{ end }}}
13
+ {{{ if template.account/bookmarks }}}active{{{ end }}}">
14
+ <div class="flex-grow-1">[[global:posts]]</div>
15
+ <span class="flex-shrink-0 text-xs" title="{counts.posts}">{humanReadableNumber(counts.posts)}</span>
16
+ </a>
17
+
18
+ <a href="{config.relative_path}/user/{userslug}/topics" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
19
+ {{{ if template.account/topics }}}active{{{ end }}}
20
+ {{{ if template.account/watched }}}active{{{ end }}}
21
+ {{{ if template.account/ignored }}}active{{{ end }}}">
22
+ <div class="flex-grow-1">[[global:topics]]</div>
23
+ <span class="flex-shrink-0 text-xs" title="{counts.topics}">{humanReadableNumber(counts.topics)}</span>
24
+ </a>
25
+
26
+ <a href="{config.relative_path}/user/{userslug}/shares" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
27
+ {{{ if template.account/shares }}}active{{{ end }}}">
28
+ <div class="flex-grow-1">[[user:shares]]</div>
29
+ <span class="flex-shrink-0 text-xs" title="{counts.shares}">{humanReadableNumber(counts.shares)}</span>
30
+ </a>
31
+
32
+ <a href="{config.relative_path}/user/{userslug}/groups" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
33
+ {{{ if template.account/groups }}}active{{{ end }}}">
34
+ <div class="flex-grow-1">[[global:header.groups]]</div>
35
+ <span class="flex-shrink-0 text-xs" title="{counts.groups}">{humanReadableNumber(counts.groups)}</span>
36
+ </a>
37
+
38
+ <a href="{config.relative_path}/user/{userslug}/followers" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
39
+ {{{ if template.account/followers }}}active{{{ end }}}">
40
+ <div class="flex-grow-1">[[user:followers]]</div>
41
+ <span class="flex-shrink-0 text-xs" title="{counts.followers}">{humanReadableNumber(counts.followers)}</span>
42
+ </a>
43
+
44
+ <a href="{config.relative_path}/user/{userslug}/following" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
45
+ {{{ if template.account/following }}}active{{{ end }}}">
46
+ <div class="flex-grow-1">[[user:following]]</div>
47
+ <span class="flex-shrink-0 text-xs" title="{counts.following}">{humanReadableNumber(counts.following)}</span>
48
+ </a>
49
+
50
+ {{{ if canEdit }}}
51
+ <a href="{config.relative_path}/user/{userslug}/categories" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
52
+ {{{ if template.account/categories }}}active{{{ end }}}">
53
+ <div class="flex-grow-1">[[user:watched-categories]]</div>
54
+ <span class="flex-shrink-0 text-xs" title="{counts.categoriesWatched}">{counts.categoriesWatched}</span>
55
+ </a>
56
+ {{{ if isSelf }}}
57
+ <a href="{config.relative_path}/user/{userslug}/tags" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
58
+ {{{ if template.account/tags }}}active{{{ end }}}">
59
+ <div class="flex-grow-1">[[user:watched-tags]]</div>
60
+ <span class="flex-shrink-0 text-xs" title="{counts.tagsWatched}">{counts.tagsWatched}</span>
61
+ </a>
62
+ {{{ end }}}
63
+
64
+ <a href="{config.relative_path}/user/{userslug}/blocks" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
65
+ {{{ if template.account/blocks }}}active{{{ end }}}">
66
+ <div class="flex-grow-1">[[user:blocked-users]]</div>
67
+ <span class="flex-shrink-0 text-xs" title="{counts.blocks}">{humanReadableNumber(counts.blocks)}</span>
68
+ </a>
69
+
70
+ <a href="{config.relative_path}/user/{userslug}/uploads" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
71
+ {{{ if template.account/uploads }}}active{{{ end }}}">
72
+ <div class="flex-grow-1">[[global:uploads]]</div>
73
+ <span class="flex-shrink-0 text-xs" title="{counts.uploaded}">{humanReadableNumber(counts.uploaded)}</span>
74
+ </a>
75
+ {{{ end }}}
76
+
77
+ {{{ if (loggedIn && (!isSelf && !banned)) }}}
78
+ <hr class="w-100 my-2"/>
79
+
80
+ <a href="#" component="account/flag" class="btn btn-ghost btn-sm ff-secondary d-flex align-items-center gap-2 text-start {{{if flagId }}}hidden{{{end}}}">
81
+ <i class="flex-shrink-0 fa-solid fa-flag text-danger"></i>
82
+ <div class="flex-grow-1 text-nowrap">[[user:flag-profile]]</div>
83
+ </a>
84
+ <a href="#" component="account/already-flagged" class="btn btn-ghost btn-sm ff-secondary d-flex align-items-center gap-2 text-start {{{if !flagId }}}hidden{{{end}}}" data-flag-id="{flagId}">
85
+ <i class="flex-shrink-0 fa-solid fa-flag text-danger"></i>
86
+ <div class="flex-grow-1 text-nowrap">[[user:profile-flagged]]</div>
87
+ </a>
88
+ <a href="#" component="account/block" class="btn btn-ghost btn-sm ff-secondary d-flex align-items-center gap-2 text-start {{{ if isBlocked }}}hidden{{{ end }}}">
89
+ <i class="flex-shrink-0 fa-solid fa-ban text-danger"></i>
90
+ <div class="flex-grow-1 text-nowrap">[[user:block-user]]</div>
91
+ </a>
92
+ <a href="#" component="account/unblock" class="btn btn-ghost btn-sm ff-secondary d-flex align-items-center gap-2 text-start {{{ if !isBlocked }}}hidden{{{ end }}}">
93
+ <i class="flex-shrink-0 fa-solid fa-ban text-danger"></i>
94
+ <div class="flex-grow-1 text-nowrap">[[user:unblock-user]]</div>
95
+ </a>
96
+ {{{ end }}}
97
+
98
+ {{{ if canEdit }}}
99
+ <hr class="w-100 my-2"/>
100
+ <a href="{config.relative_path}/user/{userslug}/edit" class="btn btn-ghost btn-sm ff-secondary text-xs text-start
101
+ {{{ if template.account/edit }}}active{{{ end }}}">
102
+ <div class="flex-grow-1">[[user:edit-profile]]</div>
103
+ </a>
104
+ <a href="{config.relative_path}/user/{userslug}/settings" class="btn btn-ghost btn-sm ff-secondary text-xs text-start
105
+ {{{ if template.account/settings }}}active{{{ end }}}">
106
+ <div class="flex-grow-1">[[user:settings]]</div>
107
+ </a>
108
+ {{{ end }}}
109
+
110
+ {{{ each profile_links }}}
111
+ <a href="{config.relative_path}/user/{userslug}/{./route}" class="btn btn-ghost btn-sm ff-secondary text-xs text-start plugin-link {{{ if ./public }}}public{{{ else }}}private{{{ end }}} {{{ if (url == ./url) }}}active{{{ end }}}" id="{./id}">
112
+ <div class="flex-grow-1">{./name}</div>
113
+ </a>
114
+ {{{end}}}
115
+ </div>
116
+ </div>
@@ -1,26 +1,16 @@
1
- <script type="application/ld+json">
2
- {
3
- "@context": "https://schema.org",
4
- "@type": "BreadcrumbList",
5
- "itemListElement": [
6
- {
7
- "@type": "ListItem",
8
- "position": 1,
9
- "name": "{config.siteTitle}",
10
- "item": "{breadcrumbs.0.url}"
11
- }
12
- {{{ each breadcrumbs }}}
13
- {{{ if !@first}}}
14
- ,{
15
- "@type": "ListItem",
16
- "position": {increment(@index, "1")},
17
- "name": "{stripTags(./text)}"
18
- {{{ if !@last }}}
19
- ,"item": "{./url}"
20
- {{{ end }}}
21
- }
22
- {{{ end }}}
23
- {{{ end }}}
24
- ]
25
- }
26
- </script>
1
+ <script type="application/ld+json">{
2
+ "@context": "https://schema.org",
3
+ "@type": "BreadcrumbList",
4
+ "itemListElement": [{
5
+ "@type": "ListItem",
6
+ "position": 1,
7
+ "name": "{config.siteTitle}",
8
+ "item": "{breadcrumbs.0.url}"
9
+ }
10
+ {{{ each breadcrumbs }}}{{{ if !@first}}},{
11
+ "@type": "ListItem",
12
+ "position": {increment(@index, "1")},
13
+ "name": "{stripTags(./text)}"
14
+ {{{ if !@last }}},"item": "{./url}"{{{ end }}}
15
+ }{{{ end }}}{{{ end }}}
16
+ ]}</script>
@@ -1,12 +1,12 @@
1
- {{{ if breadcrumbs.length }}}
2
- <ol class="breadcrumb mb-0 {{{ if config.theme.centerHeaderElements }}}justify-content-center{{{ end }}}" itemscope="itemscope" itemprop="breadcrumb" itemtype="http://schema.org/BreadcrumbList">
3
- {{{ each breadcrumbs }}}
4
- <li{{{ if @last }}} component="breadcrumb/current"{{{ end }}} itemscope="itemscope" itemprop="itemListElement" itemtype="http://schema.org/ListItem" class="breadcrumb-item {{{ if @last }}}active{{{ end }}}">
5
- <meta itemprop="position" content="{increment(@index, "1")}" />
6
- {{{ if ./url }}}<a href="{./url}" itemprop="item">{{{ end }}}
7
- <span class="fw-semibold" itemprop="name">{./text}</span>
8
- {{{ if ./url }}}</a>{{{ end }}}
9
- </li>
10
- {{{ end }}}
11
- </ol>
12
- {{{ end }}}
1
+ {{{ if breadcrumbs.length }}}
2
+ <ol class="breadcrumb mb-0 {{{ if config.theme.centerHeaderElements }}}justify-content-center{{{ end }}}" itemscope="itemscope" itemprop="breadcrumb" itemtype="http://schema.org/BreadcrumbList">
3
+ {{{ each breadcrumbs }}}
4
+ <li{{{ if @last }}} component="breadcrumb/current"{{{ end }}} itemscope="itemscope" itemprop="itemListElement" itemtype="http://schema.org/ListItem" class="breadcrumb-item {{{ if @last }}}active{{{ end }}}">
5
+ <meta itemprop="position" content="{increment(@index, "1")}" />
6
+ {{{ if ./url }}}<a href="{./url}" itemprop="item">{{{ end }}}
7
+ <span class="fw-semibold" itemprop="name">{./text}</span>
8
+ {{{ if ./url }}}</a>{{{ end }}}
9
+ </li>
10
+ {{{ end }}}
11
+ </ol>
12
+ {{{ end }}}
@@ -1,22 +1,22 @@
1
- <noscript><div class="dropdown" component="category-selector"></noscript>
2
- <button component="category/post" for="category-dropdown-check" class="btn btn-primary btn-sm text-nowrap" id="new_topic" role="button">
3
- [[category:new-topic-button]]
4
- </button>
5
- <noscript>
6
- <input type="checkbox" class="hidden" id="category-dropdown-check" aria-hidden="true">
7
- <ul component="category/list" class="dropdown-menu p-1 text-sm category-dropdown-menu ghost-scrollbar" role="menu">
8
- {{{each categories}}}
9
- <li role="presentation" class="category {{{if categories.disabledClass}}}disabled{{{end}}}">
10
- <a role="menu-item" href="{config.relative_path}/compose?cid={categories.cid}">{categories.level}
11
- <span component="category-markup">
12
- <div class="category-item d-inline-block">
13
- {buildCategoryIcon(@value, "24px", "rounded-circle")}
14
- {categories.name}
15
- </div>
16
- </span>
17
- </a>
18
- </li>
19
- {{{end}}}
20
- </ul>
21
- </div>
22
- </noscript>
1
+ <noscript><div class="dropdown" component="category-selector"></noscript>
2
+ <button component="category/post" for="category-dropdown-check" class="btn btn-primary btn-sm text-nowrap" id="new_topic" role="button">
3
+ [[category:new-topic-button]]
4
+ </button>
5
+ <noscript>
6
+ <input type="checkbox" class="hidden" id="category-dropdown-check" aria-hidden="true">
7
+ <ul component="category/list" class="dropdown-menu p-1 text-sm category-dropdown-menu ghost-scrollbar" role="menu">
8
+ {{{each categories}}}
9
+ <li role="presentation" class="category {{{if categories.disabledClass}}}disabled{{{end}}}">
10
+ <a role="menu-item" href="{config.relative_path}/compose?cid={categories.cid}">{categories.level}
11
+ <span component="category-markup">
12
+ <div class="category-item d-inline-block">
13
+ {buildCategoryIcon(@value, "24px", "rounded-circle")}
14
+ {categories.name}
15
+ </div>
16
+ </span>
17
+ </a>
18
+ </li>
19
+ {{{end}}}
20
+ </ul>
21
+ </div>
22
+ </noscript>