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,140 +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
-
9
- <div class="d-flex align-items-start gap-3">
10
- <div class="icon bg-body d-none d-sm-block rounded-circle" style="outline: 2px solid var(--bs-body-bg);">
11
- <a class="d-inline-block position-relative text-decoration-none" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">
12
- {buildAvatar(posts.user, "48px", true, "", "user/picture")}
13
- <span component="user/status" class="position-absolute translate-middle-y border border-white border-2 rounded-circle status {posts.user.status}"><span class="visually-hidden">[[global:{posts.user.status}]]</span></span>
14
- </a>
15
- </div>
16
-
17
- <div class="post-container d-flex flex-grow-1 flex-column w-100" style="min-width: 0;">
18
- <div class="d-flex align-items-center gap-1 flex-wrap w-100 post-header mt-1" itemprop="author" itemscope itemtype="https://schema.org/Person">
19
- <meta itemprop="name" content="{./user.username}">
20
- {{{ if ./user.userslug }}}<meta itemprop="url" content="{config.relative_path}/user/{./user.userslug}">{{{ end }}}
21
-
22
- <div class="icon bg-body d-sm-none">
23
- <a class="d-inline-block position-relative text-decoration-none" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">
24
- {buildAvatar(posts.user, "20px", true, "", "user/picture")}
25
- <span component="user/status" class="position-absolute translate-middle-y border border-white border-2 rounded-circle status {posts.user.status}"><span class="visually-hidden">[[global:{posts.user.status}]]</span></span>
26
- </a>
27
- </div>
28
-
29
- <span class="text-nowrap">
30
- <a class="fw-bold" 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>
31
- </span>
32
-
33
- {{{ each posts.user.selectedGroups }}}
34
- {{{ if posts.user.selectedGroups.slug }}}
35
- <!-- IMPORT partials/groups/badge.tpl -->
36
- {{{ end }}}
37
- {{{ end }}}
38
-
39
- {{{ if posts.user.banned }}}
40
- <span class="badge bg-danger rounded-1">[[user:banned]]</span>
41
- {{{ end }}}
42
-
43
- <div class="d-flex gap-1 align-items-center">
44
- <span class="text-muted">
45
- {{{ if posts.toPid }}}
46
- {generateRepliedTo(@value, config.timeagoCutoff)}
47
- {{{ else }}}
48
- {generateWrote(@value, config.timeagoCutoff)}
49
- {{{ end }}}
50
- </span>
51
-
52
- <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>
53
- <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>
54
- </div>
55
-
56
- <div>
57
- <span>
58
- {{{ if posts.user.custom_profile_info.length }}}
59
- &#124;
60
- {{{ each posts.user.custom_profile_info }}}
61
- {posts.user.custom_profile_info.content}
62
- {{{ end }}}
63
- {{{ end }}}
64
- </span>
65
- </div>
66
- <div class="d-flex align-items-center gap-1 flex-grow-1 justify-content-end">
67
- <span class="bookmarked opacity-0 text-primary"><i class="fa fa-bookmark-o"></i></span>
68
- <a href="{config.relative_path}/post/{encodeURIComponent(./pid)}" class="post-index text-muted d-none d-md-inline">#{increment(./index, "1")}</a>
69
- </div>
70
- </div>
71
-
72
- <div class="content mt-2 text-break" component="post/content" itemprop="text">
73
- {posts.content}
74
- </div>
75
- </div>
76
- </div>
77
-
78
- <div component="post/footer" class="post-footer border-bottom pb-2">
79
- {{{ if posts.user.signature }}}
80
- <div component="post/signature" data-uid="{posts.user.uid}" class="text-xs text-muted mt-2">{posts.user.signature}</div>
81
- {{{ end }}}
82
-
83
- <div class="d-flex">
84
- {{{ if !hideReplies }}}
85
- <a component="post/reply-count" data-target-component="post/replies/container" href="#" class="d-flex gap-2 align-items-center mt-2 btn-ghost ff-secondary border rounded-1 p-1 threaded-replies user-select-none text-muted text-decoration-none text-xs {{{ if (!./replies || shouldHideReplyContainer(@value)) }}}hidden{{{ end }}}">
86
- <span component="post/reply-count/avatars" class="avatars d-inline-flex gap-1 align-items-top {{{ if posts.replies.hasMore }}}hasMore{{{ end }}}">
87
- {{{each posts.replies.users}}}
88
- <span>{buildAvatar(posts.replies.users, "20px", true, "avatar-tooltip")}</span>
89
- {{{end}}}
90
- {{{ if posts.replies.hasMore}}}
91
- <span><i class="fa fa-ellipsis"></i></span>
92
- {{{ end }}}
93
- </span>
94
-
95
- <span class="ms-2 replies-count fw-semibold" component="post/reply-count/text" data-replies="{posts.replies.count}">{posts.replies.text}</span>
96
- <span class="ms-2 replies-last hidden-xs fw-semibold">[[topic:last-reply-time]] <span class="timeago" title="{posts.replies.timestampISO}"></span></span>
97
-
98
- <i class="fa fa-fw fa-chevron-down" component="post/replies/open"></i>
99
- <i class="fa fa-fw fa-chevron-up hidden" component="post/replies/close"></i>
100
- <i class="fa fa-fw fa-spin fa-spinner hidden" component="post/replies/loading"></i>
101
- </a>
102
- {{{ end }}}
103
- </div>
104
-
105
- <div component="post/replies/container" class="my-2 col-11 border rounded-1 p-3 hidden-empty"></div>
106
-
107
- <div component="post/actions" class="d-flex justify-content-end gap-1 post-tools">
108
- <!-- IMPORT partials/topic/reactions.tpl -->
109
- <a component="post/reply" href="#" class="btn-ghost-sm user-select-none {{{ if !privileges.topics:reply }}}hidden{{{ end }}}" title="[[topic:reply]]"><i class="fa fa-fw fa-reply text-primary"></i></a>
110
- <a component="post/quote" href="#" class="btn-ghost-sm user-select-none {{{ if !privileges.topics:reply }}}hidden{{{ end }}}" title="[[topic:quote]]"><i class="fa fa-fw fa-quote-right text-primary"></i></a>
111
-
112
- {{{ if !reputation:disabled }}}
113
- <div class="d-flex votes align-items-center">
114
- <a component="post/upvote" href="#" class="btn-ghost-sm {{{ if posts.upvoted }}}upvoted{{{ end }}}" title="[[topic:upvote-post]]">
115
- <i class="fa fa-fw fa-chevron-up text-primary"></i>
116
- </a>
117
-
118
- <meta itemprop="upvoteCount" content="{posts.upvotes}">
119
- <meta itemprop="downvoteCount" content="{posts.downvotes}">
120
- <a href="#" class="d-inline-block px-2 mx-1 btn-ghost-sm ff-secondary" component="post/vote-count" data-votes="{posts.votes}" title="[[global:voters]]">{posts.votes}</a>
121
-
122
- {{{ if !downvote:disabled }}}
123
- <a component="post/downvote" href="#" class="btn-ghost-sm {{{ if posts.downvoted }}}downvoted{{{ end }}}" title="[[topic:downvote-post]]">
124
- <i class="fa fa-fw fa-chevron-down text-primary"></i>
125
- </a>
126
- {{{ end }}}
127
- </div>
128
- {{{ end }}}
129
-
130
- <!-- IMPORT partials/topic/post-menu.tpl -->
131
- </div>
132
- </div>
133
-
134
- {{{ if (!./index && widgets.mainpost-footer.length) }}}
135
- <div data-widget-area="mainpost-footer">
136
- {{{ each widgets.mainpost-footer }}}
137
- {widgets.mainpost-footer.html}
138
- {{{ end }}}
139
- </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 {{{ 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>
140
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 translate-middle-y 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-ghost-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,25 +1,27 @@
1
- <div component="topic/reply/container" class="btn-group action-bar {{{ if !privileges.topics:reply }}}hidden{{{ end }}}">
2
- <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>
3
- <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]]">
4
- <span class="caret"></span>
5
- </button>
6
- <ul class="dropdown-menu dropdown-menu-end p-1 text-sm" role="menu">
7
- <li><a class="dropdown-item rounded-1" href="#" component="topic/reply-as-topic" role="menuitem">[[topic:reply-as-topic]]</a></li>
8
- </ul>
9
- </div>
10
-
11
- {{{ if loggedIn }}}
12
- {{{ if !privileges.topics:reply }}}
13
- {{{ if locked }}}
14
- <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>
15
- {{{ end }}}
16
- {{{ end }}}
17
-
18
- {{{ if !locked }}}
19
- <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>
20
- {{{ end }}}
21
- {{{ else }}}
22
- {{{ if !privileges.topics:reply }}}
23
- <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>
24
- {{{ 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 }}}
25
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-ghost-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 h-100" 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,13 +1,9 @@
1
- {{{ if privileges.view_thread_tools }}}
2
- <div class="btn-group thread-tools bottom-sheet">
3
- <button class="btn-ghost-sm ff-secondary d-flex 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">
8
- <li class="placeholder-wave"><a class="dropdown-item d-flex gap-2" href="#"><div class="placeholder bg-secondary rounded-1" style="width: 1em;"></div><div class="placeholder bg-secondary rounded-1 col-8"></div></a></li>
9
- <li class="placeholder-wave"><a class="dropdown-item d-flex gap-2" href="#"><div class="placeholder bg-secondary rounded-1" style="width: 1em;"></div><div class="placeholder bg-secondary rounded-1 col-8"></div></a></li>
10
- <li class="placeholder-wave"><a class="dropdown-item d-flex gap-2" href="#"><div class="placeholder bg-secondary rounded-1" style="width: 1em;"></div><div class="placeholder bg-secondary rounded-1 col-8"></div></a></li>
11
- </ul>
12
- </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>
13
9
  {{{ end }}}