nodebb-theme-harmony 2.0.1 → 2.0.3

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 (144) 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
@@ -1,147 +1,147 @@
1
- {{{ if (!./index && widgets.mainpost-header.length) }}}
2
- <div data-widget-area="mainpost-header">
3
- {{{ each widgets.mainpost-header }}}
4
- {widgets.mainpost-header.html}
5
- {{{ end }}}
6
- </div>
7
- {{{ end }}}
8
- <div class="d-flex align-items-start gap-3">
9
- <div class="bg-body d-none d-sm-block rounded-circle" style="outline: 2px solid var(--bs-body-bg);">
10
- <a class="d-inline-block position-relative text-decoration-none" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" aria-label="[[aria:profile-page-for, {./user.displayname}]]">
11
- {buildAvatar(posts.user, "48px", true, "", "user/picture")}
12
- {{{ if ./user.isLocal }}}
13
- <span component="user/status" class="position-absolute top-100 start-100 border border-white border-2 rounded-circle status {posts.user.status}"><span class="visually-hidden">[[global:{posts.user.status}]]</span></span>
14
- {{{ else }}}
15
- <span component="user/locality" class="position-absolute top-100 start-100 lh-1 border border-white border-2 rounded-circle small" title="[[global:remote-user]]">
16
- <span class="visually-hidden">[[global:remote-user]]</span>
17
- <i class="fa fa-globe"></i>
18
- </span>
19
- {{{ end }}}
20
- </a>
21
- </div>
22
- <div class="post-container d-flex gap-2 flex-grow-1 flex-column w-100" style="min-width:0;">
23
- <div class="d-flex align-items-start justify-content-between gap-1 flex-nowrap w-100 post-header" itemprop="author" itemscope itemtype="https://schema.org/Person">
24
- <div class="d-flex gap-1 flex-wrap align-items-center">
25
- <meta itemprop="name" content="{./user.displayname}">
26
- {{{ if ./user.userslug }}}<meta itemprop="url" content="{config.relative_path}/user/{./user.userslug}">{{{ end }}}
27
-
28
- <div class="bg-body d-sm-none">
29
- <a class="d-inline-block position-relative text-decoration-none" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">
30
- {buildAvatar(posts.user, "20px", true, "", "user/picture")}
31
- {{{ if ./user.isLocal }}}
32
- <span component="user/status" class="position-absolute top-100 start-100 border border-white border-2 rounded-circle status {posts.user.status}"><span class="visually-hidden">[[global:{posts.user.status}]]</span></span>
33
- {{{ else }}}
34
- <span component="user/locality" class="position-absolute top-100 start-100 lh-1 border border-white border-2 rounded-circle small" title="[[global:remote-user]]">
35
- <span class="visually-hidden">[[global:remote-user]]</span>
36
- <i class="fa fa-globe"></i>
37
- </span>
38
- {{{ end }}}
39
- </a>
40
- </div>
41
-
42
- <a class="fw-bold text-nowrap" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" data-username="{posts.user.username}" data-uid="{posts.user.uid}">{posts.user.displayname}</a>
43
-
44
- {{{ each posts.user.selectedGroups }}}
45
- {{{ if posts.user.selectedGroups.slug }}}
46
- <!-- IMPORT partials/groups/badge.tpl -->
47
- {{{ end }}}
48
- {{{ end }}}
49
-
50
- {{{ if posts.user.banned }}}
51
- <span class="badge bg-danger rounded-1">[[user:banned]]</span>
52
- {{{ end }}}
53
-
54
- <div class="d-flex gap-1 align-items-center">
55
- <span class="text-muted">{generateWroteReplied(@value, config.timeagoCutoff)}</span>
56
-
57
- <i component="post/edit-indicator" class="fa fa-edit text-muted{{{ if privileges.posts:history }}} pointer{{{ end }}} edit-icon {{{ if !posts.editor.username }}}hidden{{{ end }}}" title="[[global:edited-timestamp, {isoTimeToLocaleString(./editedISO, config.userLang)}]]"></i>
58
- <span data-editor="{posts.editor.userslug}" component="post/editor" class="visually-hidden">[[global:last-edited-by, {posts.editor.username}]] <span class="timeago" title="{isoTimeToLocaleString(posts.editedISO, config.userLang)}"></span></span>
59
- </div>
60
-
61
- {{{ if posts.user.custom_profile_info.length }}}
62
- <div>
63
- <span>
64
- &#124;
65
- {{{ each posts.user.custom_profile_info }}}
66
- {posts.user.custom_profile_info.content}
67
- {{{ end }}}
68
- </span>
69
- </div>
70
- {{{ end }}}
71
- </div>
72
- <div class="d-flex align-items-center gap-1 justify-content-end">
73
- <span class="bookmarked opacity-0 text-primary"><i class="fa fa-bookmark-o"></i></span>
74
- <a href="{config.relative_path}/post/{encodeURIComponent(./pid)}" class="post-index text-muted d-none d-md-inline">#{increment(./index, "1")}</a>
75
- </div>
76
- </div>
77
-
78
- <div class="content text-break" component="post/content" itemprop="text">
79
- {posts.content}
80
- </div>
81
-
82
- <div component="post/footer" class="post-footer border-bottom pb-2">
83
- {{{ if posts.user.signature }}}
84
- <div component="post/signature" data-uid="{posts.user.uid}" class="text-xs text-muted mt-2">{posts.user.signature}</div>
85
- {{{ end }}}
86
-
87
- <div class="d-flex flex-wrap {{{ if (hideReplies || !posts.replies.count) }}}justify-content-end{{{ else }}}justify-content-between{{{ end }}}">
88
- {{{ if !hideReplies }}}
89
- <a component="post/reply-count" data-target-component="post/replies/container" href="#" class="d-flex gap-2 align-items-center btn btn-ghost ff-secondary border rounded-1 p-1 text-muted text-decoration-none text-xs {{{ if (!./replies || shouldHideReplyContainer(@value)) }}}hidden{{{ end }}}">
90
- <span component="post/reply-count/avatars" class="d-flex gap-1 {{{ if posts.replies.hasMore }}}hasMore{{{ end }}}">
91
- {{{each posts.replies.users}}}
92
- <span>{buildAvatar(posts.replies.users, "20px", true, "avatar-tooltip")}</span>
93
- {{{end}}}
94
- {{{ if posts.replies.hasMore}}}
95
- <span style="height: 20px; line-height: 20px;"><i class="fa fa-ellipsis"></i></span>
96
- {{{ end }}}
97
- </span>
98
-
99
- <span class="ms-2 replies-count fw-semibold text-nowrap" component="post/reply-count/text" data-replies="{posts.replies.count}">{posts.replies.text}</span>
100
- <span class="ms-2 replies-last hidden-xs fw-semibold">[[topic:last-reply-time]] <span class="timeago" title="{posts.replies.timestampISO}"></span></span>
101
-
102
- <i class="fa fa-fw fa-chevron-down" component="post/replies/open"></i>
103
- </a>
104
- {{{ end }}}
105
- <div component="post/actions" class="d-flex flex-grow-1 align-items-center justify-content-end gap-1 post-tools">
106
- <!-- IMPORT partials/topic/reactions.tpl -->
107
- <a component="post/reply" href="#" class="btn btn-ghost btn-sm {{{ if !privileges.topics:reply }}}hidden{{{ end }}}" title="[[topic:reply]]"><i class="fa fa-fw fa-reply text-primary"></i></a>
108
- <a component="post/quote" href="#" class="btn btn-ghost btn-sm {{{ if !privileges.topics:reply }}}hidden{{{ end }}}" title="[[topic:quote]]"><i class="fa fa-fw fa-quote-right text-primary"></i></a>
109
-
110
- {{{ if ./announces }}}
111
- <a component="post/announce-count" href="#" class="btn btn-ghost btn-sm d-flex gap-2 align-items-center" title="[[topic:announcers]]"><i class="fa fa-share-alt text-primary"></i> {./announces}</a>
112
- {{{ end }}}
113
-
114
- {{{ if !reputation:disabled }}}
115
- <div class="d-flex votes align-items-center">
116
- <a component="post/upvote" href="#" class="btn btn-ghost btn-sm{{{ if posts.upvoted }}} upvoted{{{ end }}}" title="[[topic:upvote-post]]">
117
- <i class="fa fa-fw fa-chevron-up text-primary"></i>
118
- </a>
119
-
120
- <meta itemprop="upvoteCount" content="{posts.upvotes}">
121
- <meta itemprop="downvoteCount" content="{posts.downvotes}">
122
- <a href="#" class="px-2 mx-1 btn btn-ghost btn-sm" component="post/vote-count" data-votes="{posts.votes}" title="[[global:voters]]">{posts.votes}</a>
123
-
124
- {{{ if !downvote:disabled }}}
125
- <a component="post/downvote" href="#" class="btn btn-ghost btn-sm{{{ if posts.downvoted }}} downvoted{{{ end }}}" title="[[topic:downvote-post]]">
126
- <i class="fa fa-fw fa-chevron-down text-primary"></i>
127
- </a>
128
- {{{ end }}}
129
- </div>
130
- {{{ end }}}
131
-
132
- <!-- IMPORT partials/topic/post-menu.tpl -->
133
- </div>
134
- </div>
135
-
136
- <div component="post/replies/container" class="my-2 col-11 border rounded-1 p-3 hidden-empty"></div>
137
- </div>
138
- </div>
139
- </div>
140
-
141
- {{{ if (!./index && widgets.mainpost-footer.length) }}}
142
- <div data-widget-area="mainpost-footer">
143
- {{{ each widgets.mainpost-footer }}}
144
- {widgets.mainpost-footer.html}
145
- {{{ end }}}
146
- </div>
1
+ {{{ if (!./index && widgets.mainpost-header.length) }}}
2
+ <div data-widget-area="mainpost-header">
3
+ {{{ each widgets.mainpost-header }}}
4
+ {widgets.mainpost-header.html}
5
+ {{{ end }}}
6
+ </div>
7
+ {{{ end }}}
8
+ <div class="d-flex align-items-start gap-3">
9
+ <div class="bg-body d-none d-sm-block rounded-circle" style="outline: 2px solid var(--bs-body-bg);">
10
+ <a class="d-inline-block position-relative text-decoration-none" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" aria-label="[[aria:profile-page-for, {./user.displayname}]]">
11
+ {buildAvatar(posts.user, "48px", true, "", "user/picture")}
12
+ {{{ if ./user.isLocal }}}
13
+ <span component="user/status" class="position-absolute top-100 start-100 border border-white border-2 rounded-circle status {posts.user.status}"><span class="visually-hidden">[[global:{posts.user.status}]]</span></span>
14
+ {{{ else }}}
15
+ <span component="user/locality" class="position-absolute top-100 start-100 lh-1 border border-white border-2 rounded-circle small" title="[[global:remote-user]]">
16
+ <span class="visually-hidden">[[global:remote-user]]</span>
17
+ <i class="fa fa-globe"></i>
18
+ </span>
19
+ {{{ end }}}
20
+ </a>
21
+ </div>
22
+ <div class="post-container d-flex gap-2 flex-grow-1 flex-column w-100" style="min-width:0;">
23
+ <div class="d-flex align-items-start justify-content-between gap-1 flex-nowrap w-100 post-header" itemprop="author" itemscope itemtype="https://schema.org/Person">
24
+ <div class="d-flex gap-1 flex-wrap align-items-center">
25
+ <meta itemprop="name" content="{./user.displayname}">
26
+ {{{ if ./user.userslug }}}<meta itemprop="url" content="{config.relative_path}/user/{./user.userslug}">{{{ end }}}
27
+
28
+ <div class="bg-body d-sm-none">
29
+ <a class="d-inline-block position-relative text-decoration-none" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">
30
+ {buildAvatar(posts.user, "20px", true, "", "user/picture")}
31
+ {{{ if ./user.isLocal }}}
32
+ <span component="user/status" class="position-absolute top-100 start-100 border border-white border-2 rounded-circle status {posts.user.status}"><span class="visually-hidden">[[global:{posts.user.status}]]</span></span>
33
+ {{{ else }}}
34
+ <span component="user/locality" class="position-absolute top-100 start-100 lh-1 border border-white border-2 rounded-circle small" title="[[global:remote-user]]">
35
+ <span class="visually-hidden">[[global:remote-user]]</span>
36
+ <i class="fa fa-globe"></i>
37
+ </span>
38
+ {{{ end }}}
39
+ </a>
40
+ </div>
41
+
42
+ <a class="fw-bold text-nowrap" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" data-username="{posts.user.username}" data-uid="{posts.user.uid}">{posts.user.displayname}</a>
43
+
44
+ {{{ each posts.user.selectedGroups }}}
45
+ {{{ if posts.user.selectedGroups.slug }}}
46
+ <!-- IMPORT partials/groups/badge.tpl -->
47
+ {{{ end }}}
48
+ {{{ end }}}
49
+
50
+ {{{ if posts.user.banned }}}
51
+ <span class="badge bg-danger rounded-1">[[user:banned]]</span>
52
+ {{{ end }}}
53
+
54
+ <div class="d-flex gap-1 align-items-center">
55
+ <span class="text-muted">{generateWroteReplied(@value, config.timeagoCutoff)}</span>
56
+
57
+ <i component="post/edit-indicator" class="fa fa-edit text-muted{{{ if privileges.posts:history }}} pointer{{{ end }}} edit-icon {{{ if !posts.editor.username }}}hidden{{{ end }}}" title="[[global:edited-timestamp, {isoTimeToLocaleString(./editedISO, config.userLang)}]]"></i>
58
+ <span data-editor="{posts.editor.userslug}" component="post/editor" class="visually-hidden">[[global:last-edited-by, {posts.editor.username}]] <span class="timeago" title="{isoTimeToLocaleString(posts.editedISO, config.userLang)}"></span></span>
59
+ </div>
60
+
61
+ {{{ if posts.user.custom_profile_info.length }}}
62
+ <div>
63
+ <span>
64
+ &#124;
65
+ {{{ each posts.user.custom_profile_info }}}
66
+ {posts.user.custom_profile_info.content}
67
+ {{{ end }}}
68
+ </span>
69
+ </div>
70
+ {{{ end }}}
71
+ </div>
72
+ <div class="d-flex align-items-center gap-1 justify-content-end">
73
+ <span class="bookmarked opacity-0 text-primary"><i class="fa fa-bookmark-o"></i></span>
74
+ <a href="{config.relative_path}/post/{encodeURIComponent(./pid)}" class="post-index text-muted d-none d-md-inline">#{increment(./index, "1")}</a>
75
+ </div>
76
+ </div>
77
+
78
+ <div class="content text-break" component="post/content" itemprop="text">
79
+ {posts.content}
80
+ </div>
81
+
82
+ <div component="post/footer" class="post-footer border-bottom pb-2">
83
+ {{{ if posts.user.signature }}}
84
+ <div component="post/signature" data-uid="{posts.user.uid}" class="text-xs text-muted mt-2">{posts.user.signature}</div>
85
+ {{{ end }}}
86
+
87
+ <div class="d-flex flex-wrap gap-2 {{{ if (hideReplies || !posts.replies.count) }}}justify-content-end{{{ else }}}justify-content-between{{{ end }}}">
88
+ {{{ if !hideReplies }}}
89
+ <a component="post/reply-count" data-target-component="post/replies/container" href="#" class="d-flex gap-2 align-items-center btn btn-ghost ff-secondary border rounded-1 p-1 text-muted text-decoration-none text-xs {{{ if (!./replies || shouldHideReplyContainer(@value)) }}}hidden{{{ end }}}">
90
+ <span component="post/reply-count/avatars" class="d-flex gap-1 {{{ if posts.replies.hasMore }}}hasMore{{{ end }}}">
91
+ {{{each posts.replies.users}}}
92
+ <span>{buildAvatar(posts.replies.users, "20px", true, "avatar-tooltip")}</span>
93
+ {{{end}}}
94
+ {{{ if posts.replies.hasMore}}}
95
+ <span style="height: 20px; line-height: 20px;"><i class="fa fa-ellipsis"></i></span>
96
+ {{{ end }}}
97
+ </span>
98
+
99
+ <span class="ms-2 replies-count fw-semibold text-nowrap" component="post/reply-count/text" data-replies="{posts.replies.count}">{posts.replies.text}</span>
100
+ <span class="ms-2 replies-last hidden-xs fw-semibold">[[topic:last-reply-time]] <span class="timeago" title="{posts.replies.timestampISO}"></span></span>
101
+
102
+ <i class="fa fa-fw fa-chevron-down" component="post/replies/open"></i>
103
+ </a>
104
+ {{{ end }}}
105
+ <div component="post/actions" class="d-flex flex-grow-1 align-items-center justify-content-end gap-1 post-tools">
106
+ <!-- IMPORT partials/topic/reactions.tpl -->
107
+ <a component="post/reply" href="#" class="btn btn-ghost btn-sm {{{ if !privileges.topics:reply }}}hidden{{{ end }}}" title="[[topic:reply]]"><i class="fa fa-fw fa-reply text-primary"></i></a>
108
+ <a component="post/quote" href="#" class="btn btn-ghost btn-sm {{{ if !privileges.topics:reply }}}hidden{{{ end }}}" title="[[topic:quote]]"><i class="fa fa-fw fa-quote-right text-primary"></i></a>
109
+
110
+ {{{ if ./announces }}}
111
+ <a component="post/announce-count" href="#" class="btn btn-ghost btn-sm d-flex gap-2 align-items-center" title="[[topic:announcers]]"><i class="fa fa-share-alt text-primary"></i> {./announces}</a>
112
+ {{{ end }}}
113
+
114
+ {{{ if !reputation:disabled }}}
115
+ <div class="d-flex votes align-items-center">
116
+ <a component="post/upvote" href="#" class="btn btn-ghost btn-sm{{{ if posts.upvoted }}} upvoted{{{ end }}}" title="[[topic:upvote-post]]">
117
+ <i class="fa fa-fw fa-chevron-up text-primary"></i>
118
+ </a>
119
+
120
+ <meta itemprop="upvoteCount" content="{posts.upvotes}">
121
+ <meta itemprop="downvoteCount" content="{posts.downvotes}">
122
+ <a href="#" class="px-2 mx-1 btn btn-ghost btn-sm" component="post/vote-count" data-votes="{posts.votes}" title="[[global:voters]]">{posts.votes}</a>
123
+
124
+ {{{ if !downvote:disabled }}}
125
+ <a component="post/downvote" href="#" class="btn btn-ghost btn-sm{{{ if posts.downvoted }}} downvoted{{{ end }}}" title="[[topic:downvote-post]]">
126
+ <i class="fa fa-fw fa-chevron-down text-primary"></i>
127
+ </a>
128
+ {{{ end }}}
129
+ </div>
130
+ {{{ end }}}
131
+
132
+ <!-- IMPORT partials/topic/post-menu.tpl -->
133
+ </div>
134
+ </div>
135
+
136
+ <div component="post/replies/container" class="my-2 col-11 border rounded-1 p-3 hidden-empty"></div>
137
+ </div>
138
+ </div>
139
+ </div>
140
+
141
+ {{{ if (!./index && widgets.mainpost-footer.length) }}}
142
+ <div data-widget-area="mainpost-footer">
143
+ {{{ each widgets.mainpost-footer }}}
144
+ {widgets.mainpost-footer.html}
145
+ {{{ end }}}
146
+ </div>
147
147
  {{{ end }}}
@@ -1,28 +1,28 @@
1
- {{{ if privileges.topics:reply }}}
2
- <div component="topic/quickreply/container" class="quick-reply d-flex gap-3 mb-4">
3
- <div class="icon hidden-xs">
4
- <a class="d-inline-block position-relative" href="{{{ if loggedInUser.userslug }}}{config.relative_path}/user/{loggedInUser.userslug}{{{ else }}}#{{{ end }}}">
5
- {buildAvatar(loggedInUser, "48px", true, "", "user/picture")}
6
- {{{ if loggedInUser.status }}}<span component="user/status" class="position-absolute top-100 start-100 border border-white border-2 rounded-circle status {loggedInUser.status}"><span class="visually-hidden">[[global:{loggedInUser.status}]]</span></span>{{{ end }}}
7
- </a>
8
- </div>
9
- <form class="flex-grow-1 d-flex flex-column gap-2" method="post" action="{config.relative_path}/compose">
10
- <input type="hidden" name="tid" value="{tid}" />
11
- <input type="hidden" name="_csrf" value="{config.csrf_token}" />
12
- <div class="quickreply-message position-relative">
13
- <textarea rows="4" name="content" component="topic/quickreply/text" class="form-control mousetrap" placeholder="[[modules:composer.textarea.placeholder]]"></textarea>
14
- <div class="imagedrop"><div>[[topic:composer.drag-and-drop-images]]</div></div>
15
- </div>
16
- <div>
17
- <div class="d-flex justify-content-end gap-2">
18
- <button type="submit" component="topic/quickreply/expand" class="btn btn-ghost btn-sm border" title="[[topic:open-composer]]"><i class="fa fa-expand"></i></button>
19
- <button type="submit" component="topic/quickreply/button" class="btn btn-sm btn-primary">[[topic:post-quick-reply]]</button>
20
- </div>
21
- </div>
22
- </form>
23
- <form class="d-none" component="topic/quickreply/upload" method="post" enctype="multipart/form-data">
24
- <input type="file" name="files[]" multiple class="hidden"/>
25
- </form>
26
-
27
- </div>
28
- {{{ end }}}
1
+ {{{ if privileges.topics:reply }}}
2
+ <div component="topic/quickreply/container" class="quick-reply d-flex gap-3 mb-4">
3
+ <div class="icon hidden-xs">
4
+ <a class="d-inline-block position-relative" href="{{{ if loggedInUser.userslug }}}{config.relative_path}/user/{loggedInUser.userslug}{{{ else }}}#{{{ end }}}">
5
+ {buildAvatar(loggedInUser, "48px", true, "", "user/picture")}
6
+ {{{ if loggedInUser.status }}}<span component="user/status" class="position-absolute top-100 start-100 border border-white border-2 rounded-circle status {loggedInUser.status}"><span class="visually-hidden">[[global:{loggedInUser.status}]]</span></span>{{{ end }}}
7
+ </a>
8
+ </div>
9
+ <form class="flex-grow-1 d-flex flex-column gap-2" method="post" action="{config.relative_path}/compose">
10
+ <input type="hidden" name="tid" value="{tid}" />
11
+ <input type="hidden" name="_csrf" value="{config.csrf_token}" />
12
+ <div class="quickreply-message position-relative">
13
+ <textarea rows="4" name="content" component="topic/quickreply/text" class="form-control mousetrap" placeholder="[[modules:composer.textarea.placeholder]]"></textarea>
14
+ <div class="imagedrop"><div>[[topic:composer.drag-and-drop-images]]</div></div>
15
+ </div>
16
+ <div>
17
+ <div class="d-flex justify-content-end gap-2">
18
+ <button type="submit" component="topic/quickreply/expand" class="btn btn-ghost btn-sm border" title="[[topic:open-composer]]"><i class="fa fa-expand"></i></button>
19
+ <button type="submit" component="topic/quickreply/button" class="btn btn-sm btn-primary">[[topic:post-quick-reply]]</button>
20
+ </div>
21
+ </div>
22
+ </form>
23
+ <form class="d-none" component="topic/quickreply/upload" method="post" enctype="multipart/form-data">
24
+ <input type="file" name="files[]" multiple class="hidden"/>
25
+ </form>
26
+
27
+ </div>
28
+ {{{ end }}}
@@ -1,27 +1,27 @@
1
- {{{ if privileges.topics:reply }}}
2
- <div component="topic/reply/container" class="btn-group">
3
- <a href="{config.relative_path}/compose?tid={tid}" class="d-flex align-items-center btn btn-sm btn-primary px-3 fw-semibold" component="topic/reply" data-ajaxify="false" role="button"><i class="fa fa-reply d-sm-block d-md-none"></i><span class="d-none d-md-block"> [[topic:reply]]</span></a>
4
- <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="[[topic:reply-options]]">
5
- <span class="caret"></span>
6
- </button>
7
- <ul class="dropdown-menu dropdown-menu-end p-1 text-sm" role="menu">
8
- <li><a class="dropdown-item rounded-1" href="#" component="topic/reply-as-topic" role="menuitem">[[topic:reply-as-topic]]</a></li>
9
- </ul>
10
- </div>
11
- {{{ end }}}
12
-
13
- {{{ if loggedIn }}}
14
- {{{ if !privileges.topics:reply }}}
15
- {{{ if locked }}}
16
- <a href="#" component="topic/reply/locked" class="d-flex gap-2 align-items-center fw-semibold btn btn-sm btn-primary disabled" disabled><i class="fa fa-lock"></i> [[topic:locked]]</a>
17
- {{{ end }}}
18
- {{{ end }}}
19
-
20
- {{{ if !locked }}}
21
- <a href="#" component="topic/reply/locked" class="d-flex gap-2 align-items-center fw-semibold btn btn-sm btn-primary disabled hidden" disabled><i class="fa fa-lock"></i> [[topic:locked]]</a>
22
- {{{ end }}}
23
- {{{ else }}}
24
- {{{ if !privileges.topics:reply }}}
25
- <a component="topic/reply/guest" href="{config.relative_path}/login" class="d-flex align-items-center fw-semibold btn btn-sm btn-primary">[[topic:guest-login-reply]]</a>
26
- {{{ end }}}
1
+ {{{ if privileges.topics:reply }}}
2
+ <div component="topic/reply/container" class="btn-group">
3
+ <a href="{config.relative_path}/compose?tid={tid}" class="d-flex align-items-center btn btn-sm btn-primary px-3 fw-semibold" component="topic/reply" data-ajaxify="false" role="button"><i class="fa fa-reply d-sm-block d-md-none"></i><span class="d-none d-md-block"> [[topic:reply]]</span></a>
4
+ <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="[[topic:reply-options]]">
5
+ <span class="caret"></span>
6
+ </button>
7
+ <ul class="dropdown-menu dropdown-menu-end p-1 text-sm" role="menu">
8
+ <li><a class="dropdown-item rounded-1" href="#" component="topic/reply-as-topic" role="menuitem">[[topic:reply-as-topic]]</a></li>
9
+ </ul>
10
+ </div>
11
+ {{{ end }}}
12
+
13
+ {{{ if loggedIn }}}
14
+ {{{ if !privileges.topics:reply }}}
15
+ {{{ if locked }}}
16
+ <a href="#" component="topic/reply/locked" class="d-flex gap-2 align-items-center fw-semibold btn btn-sm btn-primary disabled" disabled><i class="fa fa-lock"></i> [[topic:locked]]</a>
17
+ {{{ end }}}
18
+ {{{ end }}}
19
+
20
+ {{{ if !locked }}}
21
+ <a href="#" component="topic/reply/locked" class="d-flex gap-2 align-items-center fw-semibold btn btn-sm btn-primary disabled hidden" disabled><i class="fa fa-lock"></i> [[topic:locked]]</a>
22
+ {{{ end }}}
23
+ {{{ else }}}
24
+ {{{ if !privileges.topics:reply }}}
25
+ <a component="topic/reply/guest" href="{config.relative_path}/login" class="d-flex align-items-center fw-semibold btn btn-sm btn-primary">[[topic:guest-login-reply]]</a>
26
+ {{{ end }}}
27
27
  {{{ end }}}
@@ -1,3 +1,3 @@
1
- <div component="selection/tooltip" class="selection-tooltip-container position-absolute card card-body p-1 rounded-1 mt-2" style="z-index: 1;">
2
- <button component="selection/tooltip/quote" class="btn btn-sm btn-primary quote-tooltip-btn">[[topic:quote]]</button>
1
+ <div component="selection/tooltip" class="selection-tooltip-container position-absolute card card-body p-1 rounded-1 mt-2" style="z-index: 1;">
2
+ <button component="selection/tooltip/quote" class="btn btn-sm btn-primary quote-tooltip-btn">[[topic:quote]]</button>
3
3
  </div>
@@ -1,27 +1,27 @@
1
- <div class="btn-group bottom-sheet" component="thread/sort">
2
- <button class="btn btn-ghost btn-sm ff-secondary d-flex gap-2 align-items-center dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="[[aria:post-sort-option, {sortOptionLabel}]]">
3
- <i class="fa fa-fw fa-arrow-down-wide-short text-primary"></i>
4
- <span class="d-none d-md-inline fw-semibold">{sortOptionLabel}</span>
5
- </button>
6
-
7
- <ul class="dropdown-menu p-1 text-sm" role="menu">
8
- <li>
9
- <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" href="#" class="oldest_to_newest" data-sort="oldest_to_newest" role="menuitem">
10
- <span class="flex-grow-1">[[topic:oldest-to-newest]]</span>
11
- <i class="flex-shrink-0 fa fa-fw text-secondary"></i>
12
- </a>
13
- </li>
14
- <li>
15
- <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" href="#" class="newest_to_oldest" data-sort="newest_to_oldest" role="menuitem">
16
- <span class="flex-grow-1">[[topic:newest-to-oldest]]</span>
17
- <i class="flex-shrink-0 fa fa-fw text-secondary"></i>
18
- </a>
19
- </li>
20
- <li>
21
- <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" href="#" class="most_votes" data-sort="most_votes" role="menuitem">
22
- <span class="flex-grow-1">[[topic:most-votes]]</span>
23
- <i class="flex-shrink-0 fa fa-fw text-secondary"></i>
24
- </a>
25
- </li>
26
- </ul>
27
- </div>
1
+ <div class="btn-group bottom-sheet" component="thread/sort">
2
+ <button class="btn btn-ghost btn-sm ff-secondary d-flex gap-2 align-items-center dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="[[aria:post-sort-option, {sortOptionLabel}]]">
3
+ <i class="fa fa-fw fa-arrow-down-wide-short text-primary"></i>
4
+ <span class="d-none d-md-inline fw-semibold">{sortOptionLabel}</span>
5
+ </button>
6
+
7
+ <ul class="dropdown-menu p-1 text-sm" role="menu">
8
+ <li>
9
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" href="#" class="oldest_to_newest" data-sort="oldest_to_newest" role="menuitem">
10
+ <span class="flex-grow-1">[[topic:oldest-to-newest]]</span>
11
+ <i class="flex-shrink-0 fa fa-fw text-secondary"></i>
12
+ </a>
13
+ </li>
14
+ <li>
15
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" href="#" class="newest_to_oldest" data-sort="newest_to_oldest" role="menuitem">
16
+ <span class="flex-grow-1">[[topic:newest-to-oldest]]</span>
17
+ <i class="flex-shrink-0 fa fa-fw text-secondary"></i>
18
+ </a>
19
+ </li>
20
+ <li>
21
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" href="#" class="most_votes" data-sort="most_votes" role="menuitem">
22
+ <span class="flex-grow-1">[[topic:most-votes]]</span>
23
+ <i class="flex-shrink-0 fa fa-fw text-secondary"></i>
24
+ </a>
25
+ </li>
26
+ </ul>
27
+ </div>
@@ -1,15 +1,15 @@
1
- <span class="badge text-body border border-gray-300 stats text-xs">
2
- <i class="fa-regular fa-fw fa-message visible-xs-inline" title="[[global:posts]]"></i>
3
- <span component="topic/post-count" title="{postcount}" class="fw-bold">{humanReadableNumber(postcount)}</span>
4
- <span class="hidden-xs text-lowercase fw-normal">[[global:posts]]</span>
5
- </span>
6
- <span class="badge text-body border border-gray-300 stats text-xs">
7
- <i class="fa fa-fw fa-user visible-xs-inline" title="[[global:posters]]"></i>
8
- <span title="{postercount}" class="fw-bold">{humanReadableNumber(postercount)}</span>
9
- <span class="hidden-xs text-lowercase fw-normal">[[global:posters]]</span>
10
- </span>
11
- <span class="badge text-body border border-gray-300 stats text-xs">
12
- <i class="fa fa-fw fa-eye visible-xs-inline" title="[[global:views]]"></i>
13
- <span class="fw-bold" title="{viewcount}">{humanReadableNumber(viewcount)}</span>
14
- <span class="hidden-xs text-lowercase fw-normal">[[global:views]]</span>
1
+ <span class="badge text-body border border-gray-300 stats text-xs">
2
+ <i class="fa-regular fa-fw fa-message visible-xs-inline" title="[[global:posts]]"></i>
3
+ <span component="topic/post-count" title="{postcount}" class="fw-bold">{humanReadableNumber(postcount)}</span>
4
+ <span class="hidden-xs text-lowercase fw-normal">[[global:posts]]</span>
5
+ </span>
6
+ <span class="badge text-body border border-gray-300 stats text-xs">
7
+ <i class="fa fa-fw fa-user visible-xs-inline" title="[[global:posters]]"></i>
8
+ <span title="{postercount}" class="fw-bold">{humanReadableNumber(postercount)}</span>
9
+ <span class="hidden-xs text-lowercase fw-normal">[[global:posters]]</span>
10
+ </span>
11
+ <span class="badge text-body border border-gray-300 stats text-xs">
12
+ <i class="fa fa-fw fa-eye visible-xs-inline" title="[[global:views]]"></i>
13
+ <span class="fw-bold" title="{viewcount}">{humanReadableNumber(viewcount)}</span>
14
+ <span class="hidden-xs text-lowercase fw-normal">[[global:views]]</span>
15
15
  </span>
@@ -1,5 +1,5 @@
1
- {{{ each thumbs }}}
2
- <a class="d-inline-block" href="{./url}">
3
- <img class="rounded-1 h-100 bg-light" style="max-width: 5.33rem; object-fit: contain;" src="{./url}" />
4
- </a>
1
+ {{{ each thumbs }}}
2
+ <a class="d-inline-block" href="{./url}">
3
+ <img class="rounded-1 h-100 bg-light" style="max-width: 5.33rem; object-fit: contain;" src="{./url}" />
4
+ </a>
5
5
  {{{ end }}}
@@ -1,9 +1,9 @@
1
- {{{ if privileges.view_thread_tools }}}
2
- <div class="btn-group thread-tools bottom-sheet">
3
- <button class="btn btn-ghost btn-sm ff-secondary d-flex align-items-center gap-2 dropdown-toggle" data-bs-toggle="dropdown" type="button" aria-haspopup="true" aria-expanded="false">
4
- <i class="fa fa-fw fa-gear text-primary"></i>
5
- <span class="d-none d-md-inline fw-semibold">[[topic:thread-tools.title]]</span>
6
- </button>
7
- <ul class="dropdown-menu p-1 text-sm" role="menu"></ul>
8
- </div>
1
+ {{{ if privileges.view_thread_tools }}}
2
+ <div class="btn-group thread-tools bottom-sheet">
3
+ <button class="btn btn-ghost btn-sm ff-secondary d-flex align-items-center gap-2 dropdown-toggle" data-bs-toggle="dropdown" type="button" aria-haspopup="true" aria-expanded="false">
4
+ <i class="fa fa-fw fa-gear text-primary"></i>
5
+ <span class="d-none d-md-inline fw-semibold">[[topic:thread-tools.title]]</span>
6
+ </button>
7
+ <ul class="dropdown-menu p-1 text-sm" role="menu"></ul>
8
+ </div>
9
9
  {{{ end }}}