nodebb-theme-harmony 2.0.0 → 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 (145) hide show
  1. package/.eslintrc +3 -3
  2. package/README.md +22 -22
  3. package/lib/controllers.js +29 -29
  4. package/library.js +183 -183
  5. package/package.json +48 -48
  6. package/plugin.json +24 -24
  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 -122
  16. package/scss/fonts.scss +19 -19
  17. package/scss/groups.scss +22 -22
  18. package/scss/harmony.scss +24 -24
  19. package/scss/header.scss +15 -15
  20. package/scss/mixins.scss +183 -183
  21. package/scss/modals.scss +6 -6
  22. package/scss/modules/breadcrumbs.scss +15 -15
  23. package/scss/modules/cover.scss +102 -102
  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 -65
  32. package/scss/sidebar.scss +188 -188
  33. package/scss/skins.scss +58 -58
  34. package/scss/status.scss +24 -24
  35. package/scss/topic.scss +130 -130
  36. package/templates/account/blocks.tpl +51 -51
  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 -29
  41. package/templates/account/edit.tpl +137 -137
  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 -270
  46. package/templates/account/posts.tpl +35 -35
  47. package/templates/account/profile.tpl +92 -92
  48. package/templates/account/sessions.tpl +8 -8
  49. package/templates/account/settings.tpl +236 -236
  50. package/templates/account/shares.tpl +19 -19
  51. package/templates/account/tags.tpl +12 -12
  52. package/templates/account/theme.tpl +63 -63
  53. package/templates/account/topics.tpl +44 -44
  54. package/templates/account/uploads.tpl +37 -37
  55. package/templates/admin/plugins/harmony.tpl +57 -57
  56. package/templates/categories.tpl +29 -29
  57. package/templates/category.tpl +72 -72
  58. package/templates/footer.tpl +17 -17
  59. package/templates/groups/details.tpl +86 -86
  60. package/templates/groups/list.tpl +58 -58
  61. package/templates/groups/members.tpl +9 -9
  62. package/templates/header.tpl +45 -45
  63. package/templates/notifications.tpl +32 -32
  64. package/templates/partials/account/admin-menu.tpl +36 -36
  65. package/templates/partials/account/category-item.tpl +22 -22
  66. package/templates/partials/account/footer.tpl +2 -2
  67. package/templates/partials/account/header.tpl +98 -98
  68. package/templates/partials/account/session-list.tpl +18 -18
  69. package/templates/partials/account/sidebar-left.tpl +116 -116
  70. package/templates/partials/breadcrumbs-json-ld.tpl +15 -15
  71. package/templates/partials/breadcrumbs.tpl +12 -12
  72. package/templates/partials/buttons/newTopic.tpl +22 -22
  73. package/templates/partials/categories/item.tpl +56 -56
  74. package/templates/partials/categories/lastpost.tpl +24 -24
  75. package/templates/partials/categories/link.tpl +4 -4
  76. package/templates/partials/category/subcategory.tpl +18 -18
  77. package/templates/partials/category/tags.tpl +3 -3
  78. package/templates/partials/cookie-consent.tpl +6 -6
  79. package/templates/partials/groups/admin.tpl +95 -95
  80. package/templates/partials/groups/invited.tpl +32 -32
  81. package/templates/partials/groups/list.tpl +15 -15
  82. package/templates/partials/groups/memberlist.tpl +46 -46
  83. package/templates/partials/groups/pending.tpl +29 -29
  84. package/templates/partials/groups/sidebar-left.tpl +27 -27
  85. package/templates/partials/header/brand.tpl +27 -27
  86. package/templates/partials/mobile-footer.tpl +95 -95
  87. package/templates/partials/notifications_list.tpl +44 -44
  88. package/templates/partials/paginator.tpl +46 -46
  89. package/templates/partials/post_bar.tpl +27 -27
  90. package/templates/partials/posts_list.tpl +7 -7
  91. package/templates/partials/posts_list_item.tpl +19 -19
  92. package/templates/partials/quick-search-results.tpl +46 -46
  93. package/templates/partials/search-filters.tpl +183 -183
  94. package/templates/partials/search-results.tpl +54 -54
  95. package/templates/partials/sidebar/chats.tpl +45 -45
  96. package/templates/partials/sidebar/drafts.tpl +63 -63
  97. package/templates/partials/sidebar/logged-in-menu.tpl +22 -22
  98. package/templates/partials/sidebar/logged-out-menu.tpl +44 -44
  99. package/templates/partials/sidebar/notifications.tpl +49 -49
  100. package/templates/partials/sidebar/search-mobile.tpl +28 -28
  101. package/templates/partials/sidebar/search.tpl +30 -30
  102. package/templates/partials/sidebar/user-menu.tpl +103 -103
  103. package/templates/partials/sidebar-left.tpl +39 -39
  104. package/templates/partials/sidebar-right.tpl +16 -16
  105. package/templates/partials/skin-switcher.tpl +50 -50
  106. package/templates/partials/tags_list.tpl +7 -7
  107. package/templates/partials/toast.tpl +19 -19
  108. package/templates/partials/topic/event.tpl +12 -12
  109. package/templates/partials/topic/navigation-post.tpl +9 -9
  110. package/templates/partials/topic/navigator-mobile.tpl +61 -61
  111. package/templates/partials/topic/navigator.tpl +26 -26
  112. package/templates/partials/topic/necro-post.tpl +5 -5
  113. package/templates/partials/topic/post-menu-list.tpl +156 -156
  114. package/templates/partials/topic/post-menu.tpl +4 -4
  115. package/templates/partials/topic/post-placeholder.tpl +14 -14
  116. package/templates/partials/topic/post.tpl +146 -146
  117. package/templates/partials/topic/quickreply.tpl +28 -28
  118. package/templates/partials/topic/reply-button.tpl +26 -26
  119. package/templates/partials/topic/selection-tooltip.tpl +2 -2
  120. package/templates/partials/topic/sort.tpl +27 -27
  121. package/templates/partials/topic/stats.tpl +14 -14
  122. package/templates/partials/topic/thumbs.tpl +4 -4
  123. package/templates/partials/topic/tools.tpl +8 -8
  124. package/templates/partials/topic/topic-menu-list.tpl +73 -73
  125. package/templates/partials/topic/watch.tpl +59 -59
  126. package/templates/partials/topic-filters.tpl +15 -15
  127. package/templates/partials/topic-list-bar.tpl +54 -54
  128. package/templates/partials/topic-terms.tpl +15 -15
  129. package/templates/partials/topics_list.tpl +131 -131
  130. package/templates/partials/users/item.tpl +39 -39
  131. package/templates/partials/users_list.tpl +4 -4
  132. package/templates/partials/users_list_menu.tpl +14 -14
  133. package/templates/popular.tpl +34 -34
  134. package/templates/post-queue.tpl +211 -211
  135. package/templates/recent.tpl +42 -42
  136. package/templates/search.tpl +46 -46
  137. package/templates/tag.tpl +34 -34
  138. package/templates/tags.tpl +49 -49
  139. package/templates/top.tpl +34 -34
  140. package/templates/topic.tpl +123 -123
  141. package/templates/unread.tpl +31 -31
  142. package/templates/users.tpl +39 -39
  143. package/templates/world.tpl +66 -66
  144. package/theme.json +6 -6
  145. package/package-lock.json +0 -2338
@@ -1,98 +1,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
+ <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,116 +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 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
+ <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,16 +1,16 @@
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 }}}
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
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>