nodebb-theme-harmony 2.0.0-pre.4 → 2.0.0-pre.41

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 (87) hide show
  1. package/README.md +3 -0
  2. package/library.js +1 -7
  3. package/package.json +2 -2
  4. package/plugin.json +1 -2
  5. package/public/harmony.js +17 -20
  6. package/scss/common.scss +2 -8
  7. package/scss/harmony.scss +0 -1
  8. package/scss/header.scss +1 -1
  9. package/scss/mixins.scss +12 -5
  10. package/scss/modules/topics-list.scss +1 -1
  11. package/scss/overrides.scss +2 -0
  12. package/scss/topic.scss +3 -11
  13. package/templates/account/blocks.tpl +18 -7
  14. package/templates/account/categories.tpl +1 -1
  15. package/templates/account/consent.tpl +2 -2
  16. package/templates/account/edit/password.tpl +8 -8
  17. package/templates/account/edit/username.tpl +2 -3
  18. package/templates/account/edit.tpl +24 -4
  19. package/templates/account/info.tpl +142 -73
  20. package/templates/account/posts.tpl +7 -7
  21. package/templates/account/profile.tpl +16 -1
  22. package/templates/account/read.tpl +1 -0
  23. package/templates/account/settings.tpl +5 -5
  24. package/templates/account/topics.tpl +6 -5
  25. package/templates/admin/plugins/harmony.tpl +1 -0
  26. package/templates/footer.tpl +1 -1
  27. package/templates/groups/list.tpl +6 -6
  28. package/templates/notifications.tpl +1 -1
  29. package/templates/partials/account/header.tpl +6 -6
  30. package/templates/partials/account/sidebar-left.tpl +21 -16
  31. package/templates/partials/breadcrumbs-json-ld.tpl +15 -25
  32. package/templates/partials/buttons/newTopic.tpl +1 -1
  33. package/templates/partials/categories/item.tpl +3 -3
  34. package/templates/partials/category/subcategory.tpl +1 -1
  35. package/templates/partials/groups/memberlist.tpl +1 -1
  36. package/templates/partials/groups/sidebar-left.tpl +5 -5
  37. package/templates/partials/header/brand.tpl +3 -1
  38. package/templates/partials/mobile-footer.tpl +3 -6
  39. package/templates/partials/notifications_list.tpl +2 -2
  40. package/templates/partials/post_bar.tpl +3 -5
  41. package/templates/partials/posts_list_item.tpl +1 -1
  42. package/templates/partials/quick-search-results.tpl +4 -4
  43. package/templates/partials/search-filters.tpl +2 -2
  44. package/templates/partials/search-results.tpl +1 -1
  45. package/templates/partials/sidebar/chats.tpl +2 -2
  46. package/templates/partials/sidebar/drafts.tpl +1 -1
  47. package/templates/partials/sidebar/notifications.tpl +2 -2
  48. package/templates/partials/sidebar/search.tpl +2 -2
  49. package/templates/partials/sidebar-left.tpl +2 -5
  50. package/templates/partials/tags_list.tpl +3 -3
  51. package/templates/partials/topic/event.tpl +1 -1
  52. package/templates/partials/topic/navigator.tpl +2 -2
  53. package/templates/partials/topic/post-menu-list.tpl +25 -1
  54. package/templates/partials/topic/post-menu.tpl +3 -29
  55. package/templates/partials/topic/post.tpl +109 -102
  56. package/templates/partials/topic/quickreply.tpl +2 -2
  57. package/templates/partials/topic/reply-button.tpl +4 -2
  58. package/templates/partials/topic/sort.tpl +1 -1
  59. package/templates/partials/topic/tools.tpl +2 -6
  60. package/templates/partials/topic/watch.tpl +1 -1
  61. package/templates/partials/topic-filters.tpl +1 -1
  62. package/templates/partials/topic-list-bar.tpl +7 -7
  63. package/templates/partials/topic-terms.tpl +1 -1
  64. package/templates/partials/topics_list.tpl +10 -2
  65. package/templates/partials/users/item.tpl +2 -2
  66. package/templates/partials/users_list_menu.tpl +5 -5
  67. package/templates/post-queue.tpl +6 -2
  68. package/templates/topic.tpl +81 -88
  69. package/templates/users.tpl +1 -1
  70. package/templates/world.tpl +21 -0
  71. package/scss/modules/bottom-sheet.scss +0 -52
  72. package/templates/flags/detail.tpl +0 -179
  73. package/templates/flags/list.tpl +0 -6
  74. package/templates/login.tpl +0 -102
  75. package/templates/partials/category/filter-dropdown-content.tpl +0 -37
  76. package/templates/partials/category/selector-dropdown-content.tpl +0 -35
  77. package/templates/partials/category/sort.tpl +0 -39
  78. package/templates/partials/category/tools.tpl +0 -89
  79. package/templates/partials/category/watch.tpl +0 -67
  80. package/templates/partials/flags/bulk-actions.tpl +0 -9
  81. package/templates/partials/flags/filters.tpl +0 -186
  82. package/templates/partials/flags/results.tpl +0 -38
  83. package/templates/partials/groups/filter-dropdown-content.tpl +0 -25
  84. package/templates/partials/tags/filter-dropdown-content.tpl +0 -34
  85. package/templates/partials/tags/watch.tpl +0 -42
  86. package/templates/partials/users/filter-dropdown-content.tpl +0 -23
  87. package/templates/register.tpl +0 -104
@@ -29,32 +29,91 @@
29
29
  [[user:info.username-history]]
30
30
  </h5>
31
31
  <div class="card-body">
32
- <ul class="list-group">
33
- {{{each usernames}}}
34
- <li class="list-group-item">
35
- {../value}
36
- <small class="float-end"><span class="timeago" title="{../timestampISO}"></span></small>
32
+ <ul class="list-unstyled mb-0">
33
+ {{{ each usernames }}}
34
+ <li class="d-flex justify-content-between mb-1">
35
+ <span class="text-sm">{./value}</span>
36
+
37
+ <div>
38
+ {{{ if ./byUid }}}
39
+ <a class="lh-1" href="{{{ if ./byUser.userslug }}}{config.relative_path}/user/{./byUser.userslug}{{{ else }}}#{{{ end }}}">
40
+ {buildAvatar(./byUser, "18px", true)}</a>
41
+ {{{ end }}}
42
+ <span class="timeago text-sm lh-1 align-middle" title="{./timestampISO}"></span>
43
+ </div>
37
44
  </li>
38
- {{{end}}}
45
+ {{{ end }}}
39
46
  </ul>
40
47
  </div>
41
48
  </div>
42
49
 
43
- <div class="card">
50
+ <div class="card mb-3">
44
51
  <h5 class="card-header">
45
52
  [[user:info.email-history]]
46
53
  </h5>
47
54
  <div class="card-body">
48
- <ul class="list-group">
49
- {{{each emails}}}
50
- <li class="list-group-item">
51
- {../value}
52
- <small class="float-end"><span class="timeago" title="{../timestampISO}"></span></small>
55
+ <ul class="list-unstyled mb-0">
56
+ {{{ each emails }}}
57
+ <li class="d-flex justify-content-between mb-1">
58
+ <span class="text-sm">{./value}</span>
59
+ <div>
60
+ {{{ if ./byUid }}}
61
+ <a class="lh-1" href="{{{ if ./byUser.userslug }}}{config.relative_path}/user/{./byUser.userslug}{{{ else }}}#{{{ end }}}">
62
+ {buildAvatar(./byUser, "18px", true)}</a>
63
+ {{{ end }}}
64
+ <span class="timeago text-sm lh-1 align-middle" title="{./timestampISO}"></span>
65
+ </div>
53
66
  </li>
54
- {{{end}}}
67
+ {{{ end }}}
55
68
  </ul>
56
69
  </div>
57
70
  </div>
71
+
72
+ {{{ if isAdminOrGlobalModerator }}}
73
+ <div class="card">
74
+ <h5 class="card-header">
75
+ [[user:info.moderation-note]]
76
+ </h5>
77
+ <div class="card-body">
78
+ <textarea component="account/moderation-note" class="form-control mb-3" aria-label="[[user:info.moderation-note]]"></textarea>
79
+
80
+ <button class="btn btn-sm float-end btn-success" component="account/save-moderation-note">[[user:info.moderation-note.add]]</button>
81
+ <br/>
82
+ <div component="account/moderation-note/list">
83
+ {{{ each moderationNotes }}}
84
+ <hr/>
85
+
86
+ <div data-id="{./id}">
87
+ <div class="mb-1">
88
+ <a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">{buildAvatar(./user, "24px", true)}</a>
89
+
90
+ <a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" class="fw-bold" itemprop="author" data-username="{./user.username}" data-uid="{./user.uid}">{./user.username}</a>
91
+
92
+ <span class="timeago" title="{./timestampISO}"></span>
93
+ </div>
94
+
95
+
96
+ <div component="account/moderation-note/content-area" class="d-flex flex-column">
97
+ <div class="content">
98
+ {./note}
99
+ </div>
100
+ <button component="account/moderation-note/edit" class="btn btn-sm btn-link align-self-end">[[topic:edit]]</button>
101
+ </div>
102
+
103
+ <div component="account/moderation-note/edit-area" class="d-flex flex-column gap-2">
104
+ <textarea class="form-control w-100 overflow-hidden">{./rawNote}</textarea>
105
+ <div class="align-self-end">
106
+ <button component="account/moderation-note/cancel-edit" class="btn btn-sm btn-link text-danger align-self-end">[[global:cancel]]</button>
107
+ <button component="account/moderation-note/save-edit" class="btn btn-sm btn-primary align-self-end">[[global:save]]</button>
108
+ </div>
109
+ </div>
110
+ </div>
111
+ {{{ end }}}
112
+ </div>
113
+ <!-- IMPORT partials/paginator.tpl -->
114
+ </div>
115
+ </div>
116
+ {{{ end }}}
58
117
  </div>
59
118
  <div class="col-sm-6 mb-3">
60
119
  <div class="card mb-3">
@@ -65,15 +124,38 @@
65
124
  {{{ if history.flags.length }}}
66
125
  <ul class="recent-flags list-unstyled">
67
126
  {{{ each history.flags }}}
68
- <li>
69
- <p>
127
+ <li class="mb-4 border-bottom">
128
+ <div class="mb-1 d-flex align-items-center justify-content-between">
129
+ <div>
130
+ {{{ if (./type == "user")}}}
131
+ <span class="badge text-bg-info">[[user:info.profile]]</span>
132
+ {{{ else }}}
133
+ <span class="badge text-bg-info">[[user:info.post]]</span>
134
+ {{{ end }}}
135
+ <span class="timestamp timeago" title="{./timestampISO}"></span>
136
+ </div>
137
+
138
+ <a href="{config.relative_path}/flags/{./flagId}" class="badge badge border border-gray-300 text-body">[[user:info.view-flag]]</a>
139
+ </div>
140
+
141
+ {{{ if (./type == "post") }}}
142
+ <p class="mb-1">
70
143
  {{{ if history.flags.targetPurged }}}
71
144
  <div>[[flags:target-purged]]</div>
72
145
  {{{ else }}}
73
- <a class="title" href="{config.relative_path}/post/{./pid}">{./title}</a><br />
146
+ <a class="title" href="{config.relative_path}/post/{./pid}">{./title}</a>
74
147
  {{{ end }}}
75
- <span class="timestamp">[[flags:flagged-timeago-readable, {./timestampISO}, {./timestampReadable}]]</span>
76
148
  </p>
149
+ {{{ end }}}
150
+
151
+ <div class="d-flex gap-2 align-items-center mb-3">
152
+ <span class="text-sm">[[user:info.reported-by]]</span>
153
+ <div class="d-flex text-nowrap">
154
+ {{{ each ./reports }}}
155
+ <a style="width: 18px; z-index: 3;" class="text-decoration-none" href="{config.relative_path}/user/{./reporter.userslug}">{buildAvatar(./reporter, "24px", true)}</a>
156
+ {{{ end }}}
157
+ </div>
158
+ </div>
77
159
  </li>
78
160
  {{{ end }}}
79
161
  </ul>
@@ -97,23 +179,36 @@
97
179
  <div class="card-body">
98
180
  {{{ if history.bans.length }}}
99
181
  <ul class="ban-history list-unstyled">
100
- {{{each history.bans}}}
101
- <li>
182
+ {{{ each history.bans }}}
183
+ <li class="mb-4 border-bottom">
184
+ <div class="mb-1 d-flex align-items-center justify-content-between">
185
+ <div>
186
+ <a href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "24px", true)}</a>
187
+ <strong>
188
+ <a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" itemprop="author" data-username="{./user.username}" data-uid="{./user.uid}">{./user.username}</a>
189
+ </strong>
190
+ <span class="timestamp timeago" title="{./timestampISO}"></span>
191
+ </div>
192
+ {{{ if (./type != "unban") }}}
193
+ <span class="badge text-bg-danger">[[user:banned]]</span>
194
+ {{{ else }}}
195
+ <span class="badge text-bg-success">[[user:unbanned]]</span>
196
+ {{{ end }}}
197
+ </div>
198
+ <p class="mb-1">
199
+ <span class="reason">[[user:info.banned-reason-label]]: <strong>{./reason}</strong></span>
200
+ </p>
102
201
  <p>
103
- <a href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "24px", true)}</a>
104
- <strong>
105
- <a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" itemprop="author" data-username="{./user.username}" data-uid="{./user.uid}">{./user.username}</a>
106
- </strong>
107
- <span class="timestamp timeago" title="{./timestampISO}"></span> &mdash; {./timestampReadable}<br />
108
202
  {{{ if ./until }}}
109
- <span class="expiry">[[user:info.banned-until, {./untilReadable}]]</span><br />
203
+ <span class="expiry">[[user:info.banned-until, {isoTimeToLocaleString(./untilISO, config.userLang)}]]</span>
110
204
  {{{ else }}}
111
- <span class="expiry">[[user:info.banned-permanently]]</span><br />
205
+ {{{ if (./type != "unban") }}}
206
+ <span class="expiry">[[user:info.banned-permanently]]</span>
207
+ {{{ end }}}
112
208
  {{{ end }}}
113
- <span class="reason"><strong>[[user:info.banned-reason-label]]</strong>: {./reason}</span>
114
209
  </p>
115
210
  </li>
116
- {{{end}}}
211
+ {{{ end }}}
117
212
  </ul>
118
213
  {{{ else }}}
119
214
  <div class="alert alert-success">[[user:info.no-ban-history]]</div>
@@ -139,18 +234,28 @@
139
234
  {{{ if history.mutes.length }}}
140
235
  <ul class="ban-history list-unstyled">
141
236
  {{{ each history.mutes }}}
142
- <li>
237
+ <li class="mb-4 border-bottom">
238
+ <div class="mb-1 d-flex align-items-center justify-content-between">
239
+ <div>
240
+ <a href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "24px", true)}</a>
241
+ <strong>
242
+ <a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" itemprop="author" data-username="{./user.username}" data-uid="{./user.uid}">{./user.username}</a>
243
+ </strong>
244
+ <span class="timestamp timeago" title="{./timestampISO}"></span>
245
+ </div>
246
+ {{{ if (./type != "unmute") }}}
247
+ <span class="badge text-bg-danger">[[user:muted]]</span>
248
+ {{{ else }}}
249
+ <span class="badge text-bg-success">[[user:unmuted]]</span>
250
+ {{{ end }}}
251
+ </div>
252
+ <p class="mb-1">
253
+ <span class="reason">[[user:info.banned-reason-label]]: <strong>{./reason}</strong></span>
254
+ </p>
143
255
  <p>
144
- <a href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "24px", true)}</a>
145
- <strong>
146
- <a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" itemprop="author" data-username="{./user.username}" data-uid="{./user.uid}">{./user.username}</a>
147
- </strong>
148
- <span class="timestamp timeago" title="{./timestampISO}"></span> &mdash; {./timestampReadable}<br />
149
256
  {{{ if ./until }}}
150
- <span class="expiry">[[user:info.muted-until, {./untilReadable}]]</span><br />
257
+ <span class="expiry">[[user:info.muted-until, {isoTimeToLocaleString(./untilISO, config.userLang)}]]</span>
151
258
  {{{ end }}}
152
-
153
- <span class="reason"><strong>[[user:info.banned-reason-label]]</strong>: {./reason}</span>
154
259
  </p>
155
260
  </li>
156
261
  {{{ end }}}
@@ -160,42 +265,6 @@
160
265
  {{{ end }}}
161
266
  </div>
162
267
  </div>
163
-
164
- {{{ if isAdminOrGlobalModerator }}}
165
- <div class="card">
166
- <h5 class="card-header">
167
- [[user:info.moderation-note]]
168
- </h5>
169
- <div class="card-body">
170
- <textarea component="account/moderation-note" class="form-control mb-3" aria-label="[[user:info.moderation-note]]"></textarea>
171
-
172
- <button class="btn btn-sm float-end btn-success" component="account/save-moderation-note">[[user:info.moderation-note.add]]</button>
173
- <br/>
174
- <div component="account/moderation-note/list">
175
- {{{ each moderationNotes }}}
176
- <hr/>
177
-
178
- <div>
179
- <a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">{buildAvatar(./user, "24px", true)}</a>
180
- <strong>
181
- <a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" itemprop="author" data-username="{./user.username}" data-uid="{./user.uid}">{./user.username}</a>
182
- </strong>
183
-
184
- <div class="visible-xs-inline-block visible-sm-inline-block visible-md-inline-block visible-lg-inline-block">
185
- <span class="timeago" title="{./timestampISO}"></span>
186
- </div>
187
- <br />
188
-
189
- <div class="content">
190
- {./note}
191
- </div>
192
- </div>
193
- {{{ end }}}
194
- </div>
195
- <!-- IMPORT partials/paginator.tpl -->
196
- </div>
197
- </div>
198
- {{{ end }}}
199
268
  </div>
200
269
  </div>
201
270
 
@@ -3,19 +3,19 @@
3
3
  <div class="d-flex flex-wrap justify-content-between align-items-center gap-2 mb-3">
4
4
  <h3 class="fw-semibold fs-5 mb-0">[[global:posts]]</h3>
5
5
  <div class="d-flex flex-wrap gap-1">
6
- <a href="{config.relative_path}/user/{userslug}/posts" class="btn-ghost-sm ff-secondary fw-semibold {{{ if template.account/posts }}}active{{{ end }}}">[[global:header.recent]]</a>
6
+ <a href="{config.relative_path}/user/{userslug}/posts" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/posts }}}active{{{ end }}}">[[global:header.recent]]</a>
7
7
  {{{ if !reputation:disabled }}}
8
- <a href="{config.relative_path}/user/{userslug}/best"class="btn-ghost-sm ff-secondary fw-semibold {{{ if template.account/best }}}active{{{ end }}}">[[global:best]]</a>
9
- <a href="{config.relative_path}/user/{userslug}/controversial" class="btn-ghost-sm ff-secondary fw-semibold {{{ if template.account/controversial }}}active{{{ end }}}">[[global:controversial]]</a>
8
+ <a href="{config.relative_path}/user/{userslug}/best"class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/best }}}active{{{ end }}}">[[global:best]]</a>
9
+ <a href="{config.relative_path}/user/{userslug}/controversial" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/controversial }}}active{{{ end }}}">[[global:controversial]]</a>
10
10
  {{{ if canEdit }}}
11
- <a href="{config.relative_path}/user/{userslug}/upvoted" class="btn-ghost-sm ff-secondary fw-semibold {{{ if template.account/upvoted }}}active{{{ end }}}">[[global:upvoted]]</a>
11
+ <a href="{config.relative_path}/user/{userslug}/upvoted" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/upvoted }}}active{{{ end }}}">[[global:upvoted]]</a>
12
12
  {{{ if !downvote:disabled }}}
13
- <a href="{config.relative_path}/user/{userslug}/downvoted" class="btn-ghost-sm ff-secondary fw-semibold {{{ if template.account/downvoted }}}active{{{ end }}}">[[global:downvoted]]</a>
13
+ <a href="{config.relative_path}/user/{userslug}/downvoted" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/downvoted }}}active{{{ end }}}">[[global:downvoted]]</a>
14
14
  {{{ end }}}
15
15
  {{{ end }}}
16
16
  {{{ end }}}
17
17
  {{{ if canEdit }}}
18
- <a href="{config.relative_path}/user/{userslug}/bookmarks" class="btn-ghost-sm ff-secondary fw-semibold {{{ if template.account/bookmarks }}}active{{{ end }}}">[[user:bookmarks]]</a>
18
+ <a href="{config.relative_path}/user/{userslug}/bookmarks" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/bookmarks }}}active{{{ end }}}">[[user:bookmarks]]</a>
19
19
  {{{ end }}}
20
20
  </div>
21
21
  </div>
@@ -24,7 +24,7 @@
24
24
  <div class="alert alert-warning text-center">{noItemsFoundKey}</div>
25
25
  {{{ end }}}
26
26
 
27
- <div class="">
27
+ <div>
28
28
  <!-- IMPORT partials/posts_list.tpl -->
29
29
 
30
30
  {{{ if config.usePagination }}}
@@ -23,7 +23,7 @@
23
23
  {{{ end }}}
24
24
 
25
25
  <div class="account-stats container">
26
- <div class="row row-cols-2 row-cols-xl-3 row-cols-xxl-4 g-2">
26
+ <div class="row row-cols-2 row-cols-xl-3 row-cols-xxl-4 g-2 mb-5">
27
27
  {{{ if !reputation:disabled }}}
28
28
  <div class="stat">
29
29
  <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100">
@@ -89,6 +89,21 @@
89
89
  </div>
90
90
  </div>
91
91
  {{{ end }}}
92
+
93
+ {{{ each customUserFields }}}
94
+ {{{ if ./value }}}
95
+ <div class="stat">
96
+ <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
97
+ <span class="stat-label text-xs fw-semibold"><span><i class="text-muted {./icon}"></i> {./name}</span></span>
98
+ {{{ if (./type == "input-link") }}}
99
+ <a class="text-sm text-center text-break w-100 px-2 ff-secondary text-underline text-reset" href="{./value}" rel="nofollow noreferrer me">{./value}</a>
100
+ {{{ else }}}
101
+ <span class="text-center fs-6 ff-secondary">{./value}</span>
102
+ {{{ end }}}
103
+ </div>
104
+ </div>
105
+ {{{ end }}}
106
+ {{{ end }}}
92
107
  </div>
93
108
  </div>
94
109
 
@@ -0,0 +1 @@
1
+ <!-- IMPORT account/topics.tpl -->
@@ -100,7 +100,7 @@
100
100
  <label class="form-label text-sm" for="topicsPerPage">[[user:topics-per-page]] ([[user:max-items-per-page, {maxTopicsPerPage}]])</label>
101
101
  <input type="text" class="form-control form-control-sm" id="topicsPerPage" data-property="topicsPerPage" value="{settings.topicsPerPage}">
102
102
  </div>
103
- <div class="">
103
+ <div>
104
104
  <label class="form-label text-sm" for="postsPerPage">[[user:posts-per-page]] ([[user:max-items-per-page, {maxPostsPerPage}]])</label>
105
105
  <input type="text" class="form-control form-control-sm" id="postsPerPage" data-property="postsPerPage" value="{settings.postsPerPage}">
106
106
  </div>
@@ -119,7 +119,7 @@
119
119
  <option value="most_views" {{{ if (settings.categoryTopicSort == "most_views") }}}selected{{{ end }}}>[[topic:most-views]]</option>
120
120
  </select>
121
121
  </div>
122
- <div class="">
122
+ <div>
123
123
  <label class="form-label text-sm" for="topicPostSort">[[user:topic-post-sort]]</label>
124
124
  <select class="form-select form-select-sm" id="topicPostSort" data-property="topicPostSort">
125
125
  <option value="oldest_to_newest" {{{ if (settings.topicPostSort == "oldest_to_newest") }}}selected{{{ end }}}>[[topic:oldest-to-newest]]</option>
@@ -132,7 +132,7 @@
132
132
  {{{ if !disableEmailSubscriptions }}}
133
133
  <hr/>
134
134
  <h6 class="fw-bold">[[global:email]]</h6>
135
- <div class="">
135
+ <div>
136
136
  <div class="mb-2">
137
137
  <label class="form-label text-sm" for="dailyDigestFreq">[[user:digest-label]]</label>
138
138
  <select class="form-select form-select-sm" id="dailyDigestFreq" data-property="dailyDigestFreq" autocomplete="off">
@@ -148,7 +148,7 @@
148
148
  {{{ each customSettings}}}
149
149
  <hr/>
150
150
  <h6 class="fw-bold">{./title}</h6>
151
- <div class="">
151
+ <div>
152
152
  {./content}
153
153
  </div>
154
154
  {{{end}}}
@@ -177,7 +177,7 @@
177
177
  {{{ end }}}
178
178
 
179
179
  <h6 class="fw-bold">[[topic:watch]]</h6>
180
- <div class="">
180
+ <div>
181
181
  <div class="form-check form-switch">
182
182
  <input class="form-check-input" type="checkbox" role="switch" id="followTopicsOnCreate" data-property="followTopicsOnCreate" {{{ if settings.followTopicsOnCreate }}}checked{{{ end }}}/>
183
183
  <label class="form-check-label text-sm" for="followTopicsOnCreate">[[user:follow-topics-you-create]]</label>
@@ -2,10 +2,10 @@
2
2
 
3
3
  <div class="d-flex justify-content-between align-items-center mb-3">
4
4
  <div class="d-flex gap-1">
5
- <h3 class="fw-semibold fs-5 mb-0">[[global:topics]]</h3>
5
+ <h3 class="fw-semibold fs-5 mb-0 align-self-center">[[global:topics]]</h3>
6
6
  {{{ if showSort }}}
7
7
  <div class="btn-group bottom-sheet" component="thread/sort">
8
- <button title="[[global:sort]]" class="btn-ghost-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button"><i class="fa-solid fa-arrow-up-wide-short"></i></button>
8
+ <button title="[[global:sort]]" class="btn btn-ghost btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button"><i class="fa-solid fa-arrow-up-wide-short"></i></button>
9
9
  <ul class="dropdown-menu p-1 text-sm" role="menu">
10
10
  {{{each sortOptions }}}
11
11
  <li>
@@ -22,9 +22,10 @@
22
22
 
23
23
  <div class="d-flex gap-1">
24
24
  {{{ if canEdit }}}
25
- <a href="{config.relative_path}/user/{userslug}/topics" class="btn-ghost-sm ff-secondary fw-semibold {{{ if template.account/topics }}}active{{{ end }}}">[[global:header.recent]]</a>
26
- <a href="{config.relative_path}/user/{userslug}/watched"class="btn-ghost-sm ff-secondary fw-semibold {{{ if template.account/watched }}}active{{{ end }}}">[[user:watched]]</a>
27
- <a href="{config.relative_path}/user/{userslug}/ignored" class="btn-ghost-sm ff-secondary fw-semibold {{{ if template.account/ignored }}}active{{{ end }}}">[[user:ignored]]</a>
25
+ <a href="{config.relative_path}/user/{userslug}/topics" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/topics }}}active{{{ end }}}">[[global:header.recent]]</a>
26
+ <a href="{config.relative_path}/user/{userslug}/watched"class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/watched }}}active{{{ end }}}">[[user:watched]]</a>
27
+ <a href="{config.relative_path}/user/{userslug}/ignored" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/ignored }}}active{{{ end }}}">[[user:ignored]]</a>
28
+ <a href="{config.relative_path}/user/{userslug}/read" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/read }}}active{{{ end }}}">[[user:read]]</a>
28
29
  {{{ end }}}
29
30
  </div>
30
31
  </div>
@@ -11,6 +11,7 @@
11
11
  <div class="form-check form-switch">
12
12
  <input type="checkbox" class="form-check-input" id="enableBreadcrumbs" name="enableBreadcrumbs" />
13
13
  <label for="enableBreadcrumbs" class="form-check-label">[[themes/harmony:settings.enableBreadcrumbs]]</label>
14
+ <p class="form-text">[[themes/harmony:settings.enableBreadcrumbs.why]]</p>
14
15
  </div>
15
16
  <div class="form-check form-switch">
16
17
  <input type="checkbox" class="form-check-input" id="centerHeaderElements" name="centerHeaderElements" />
@@ -5,7 +5,7 @@
5
5
  </div>
6
6
  <!-- IMPORT partials/mobile-footer.tpl -->
7
7
  {{{ if !isSpider }}}
8
- <div class="">
8
+ <div>
9
9
  <div component="toaster/tray" class="alert-window fixed-bottom mb-5 mb-md-2 me-2 me-md-5 ms-auto" style="width:300px; z-index: 1090;">
10
10
  <!-- IMPORT partials/reconnect-alert.tpl -->
11
11
  </div>
@@ -10,15 +10,15 @@
10
10
  <div class="text-sm d-flex flex-wrap align-items-center gap-2">
11
11
  [[topic:sort-by]]
12
12
  <div class="d-flex gap-2">
13
- <a href="?sort=alpha" class="btn-ghost ff-secondary fw-semibold {{{ if (sort == "alpha") }}}active{{{ end }}}">[[groups:details.group-name]]</a>
14
- <a href="?sort=count" class="btn-ghost ff-secondary fw-semibold {{{ if (sort == "count") }}}active{{{ end }}}">[[groups:details.member-count]]</a>
15
- <a href="?sort=date" class="btn-ghost ff-secondary fw-semibold {{{ if (sort == "date") }}}active{{{ end }}}">[[groups:details.creation-date]]</a>
13
+ <a href="?sort=alpha" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if (sort == "alpha") }}}active{{{ end }}}">[[groups:details.group-name]]</a>
14
+ <a href="?sort=count" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if (sort == "count") }}}active{{{ end }}}">[[groups:details.member-count]]</a>
15
+ <a href="?sort=date" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if (sort == "date") }}}active{{{ end }}}">[[groups:details.creation-date]]</a>
16
16
  </div>
17
17
  </div>
18
18
  </div>
19
- <div class="">
19
+ <div>
20
20
  <div class="d-flex justify-content-end gap-2">
21
- <div class="">
21
+ <div>
22
22
  {{{ if allowGroupCreation }}}
23
23
  <button class="btn btn-primary btn-sm text-nowrap" data-action="new"><i class="fa fa-users"></i> [[groups:new-group]]</button>
24
24
  {{{ end }}}
@@ -28,7 +28,7 @@
28
28
  <option value="date">[[groups:details.creation-date]]</option>
29
29
  </select>
30
30
  </div>
31
- <div class="">
31
+ <div>
32
32
  <div class="input-group">
33
33
  <input type="text" class="form-control form-control-sm" placeholder="[[global:search]]" name="query" id="search-text">
34
34
  <button id="search-button" class="btn btn-primary btn-sm" aria-label="[[global:search]]">
@@ -12,7 +12,7 @@
12
12
  {{{ if ./separator }}}
13
13
  <hr/>
14
14
  {{{ else }}}
15
- <a class="btn-ghost ff-secondary fw-semibold {{{ if ./selected }}}active{{{ end }}}" href="{config.relative_path}/notifications?filter={./filter}">
15
+ <a class="btn btn-ghost d-flex gap-2 text-start text-sm ff-secondary fw-semibold {{{ if ./selected }}}active{{{ end }}}" href="{config.relative_path}/notifications?filter={./filter}">
16
16
  <div class="flex-grow-1">{filters.name}</div>
17
17
  <span class="flex-shrink-0 text-xs" title="{./count}">{humanReadableNumber(./count)}</span>
18
18
  </a>
@@ -1,10 +1,4 @@
1
1
  <div class="account w-100 mx-auto">
2
- <div data-widget-area="header">
3
- {{{each widgets.header}}}
4
- {{widgets.header.html}}
5
- {{{end}}}
6
- </div>
7
-
8
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};">
9
3
  <div class="container">
10
4
  {{{ if allowCoverPicture }}}
@@ -92,6 +86,12 @@
92
86
  </div>
93
87
  </div>
94
88
 
89
+ <div data-widget-area="header">
90
+ {{{each widgets.header}}}
91
+ {{widgets.header.html}}
92
+ {{{end}}}
93
+ </div>
94
+
95
95
  <div class="d-flex flex-column flex-md-row">
96
96
  <!-- IMPORT partials/account/sidebar-left.tpl -->
97
97
  <div class="account-content flex-grow-1 ps-md-2 ps-lg-3 ps-xl-4" style="min-width: 0;">
@@ -1,9 +1,9 @@
1
1
  <div class="flex-shrink-0 pe-2 border-end-md text-sm mb-3 flex-basis-md-200">
2
2
  <div class="sticky-md-top d-flex flex-row flex-md-column flex-wrap gap-1" style="top: 1rem;z-index: 1;">
3
- <a href="{config.relative_path}/user/{userslug}" class="btn-ghost ff-secondary fw-semibold {{{ if template.account/profile }}}active{{{ end }}}">
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
4
  <div class="flex-grow-1">[[global:about]]</div>
5
5
  </a>
6
- <a href="{config.relative_path}/user/{userslug}/posts"class="btn-ghost ff-secondary fw-semibold
6
+ <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
7
7
  {{{ if template.account/posts }}}active{{{ end }}}
8
8
  {{{ if template.account/best }}}active{{{ end }}}
9
9
  {{{ if template.account/controversial }}}active{{{ end }}}
@@ -13,52 +13,52 @@
13
13
  <div class="flex-grow-1">[[global:posts]]</div>
14
14
  <span class="flex-shrink-0 text-xs" title="{counts.posts}">{humanReadableNumber(counts.posts)}</span>
15
15
  </a>
16
- <a href="{config.relative_path}/user/{userslug}/topics" class="btn-ghost ff-secondary fw-semibold
16
+ <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
17
17
  {{{ if template.account/topics }}}active{{{ end }}}
18
18
  {{{ if template.account/watched }}}active{{{ end }}}
19
19
  {{{ if template.account/ignored }}}active{{{ end }}}">
20
20
  <div class="flex-grow-1">[[global:topics]]</div>
21
21
  <span class="flex-shrink-0 text-xs" title="{counts.topics}">{humanReadableNumber(counts.topics)}</span>
22
22
  </a>
23
- <a href="{config.relative_path}/user/{userslug}/groups" class="btn-ghost ff-secondary fw-semibold
23
+ <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
24
24
  {{{ if template.account/groups }}}active{{{ end }}}">
25
25
  <div class="flex-grow-1">[[global:header.groups]]</div>
26
26
  <span class="flex-shrink-0 text-xs" title="{counts.groups}">{humanReadableNumber(counts.groups)}</span>
27
27
  </a>
28
28
 
29
- <a href="{config.relative_path}/user/{userslug}/followers" class="btn-ghost ff-secondary fw-semibold
29
+ <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
30
30
  {{{ if template.account/followers }}}active{{{ end }}}">
31
31
  <div class="flex-grow-1">[[user:followers]]</div>
32
32
  <span class="flex-shrink-0 text-xs" title="{counts.followers}">{humanReadableNumber(counts.followers)}</span>
33
33
  </a>
34
34
 
35
- <a href="{config.relative_path}/user/{userslug}/following" class="btn-ghost ff-secondary fw-semibold
35
+ <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
36
36
  {{{ if template.account/following }}}active{{{ end }}}">
37
37
  <div class="flex-grow-1">[[user:following]]</div>
38
38
  <span class="flex-shrink-0 text-xs" title="{counts.following}">{humanReadableNumber(counts.following)}</span>
39
39
  </a>
40
40
 
41
41
  {{{ if canEdit }}}
42
- <a href="{config.relative_path}/user/{userslug}/categories" class="btn-ghost ff-secondary fw-semibold
42
+ <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
43
43
  {{{ if template.account/categories }}}active{{{ end }}}">
44
44
  <div class="flex-grow-1">[[user:watched-categories]]</div>
45
45
  <span class="flex-shrink-0 text-xs" title="{counts.categoriesWatched}">{counts.categoriesWatched}</span>
46
46
  </a>
47
47
  {{{ if isSelf }}}
48
- <a href="{config.relative_path}/user/{userslug}/tags" class="btn-ghost ff-secondary fw-semibold
48
+ <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
49
49
  {{{ if template.account/tags }}}active{{{ end }}}">
50
50
  <div class="flex-grow-1">[[user:watched-tags]]</div>
51
51
  <span class="flex-shrink-0 text-xs" title="{counts.tagsWatched}">{counts.tagsWatched}</span>
52
52
  </a>
53
53
  {{{ end }}}
54
54
 
55
- <a href="{config.relative_path}/user/{userslug}/blocks" class="btn-ghost ff-secondary fw-semibold
55
+ <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
56
56
  {{{ if template.account/blocks }}}active{{{ end }}}">
57
57
  <div class="flex-grow-1">[[user:blocked-users]]</div>
58
58
  <span class="flex-shrink-0 text-xs" title="{counts.blocks}">{humanReadableNumber(counts.blocks)}</span>
59
59
  </a>
60
60
 
61
- <a href="{config.relative_path}/user/{userslug}/uploads" class="btn-ghost ff-secondary fw-semibold
61
+ <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
62
62
  {{{ if template.account/uploads }}}active{{{ end }}}">
63
63
  <div class="flex-grow-1">[[global:uploads]]</div>
64
64
  <span class="flex-shrink-0 text-xs" title="{counts.uploaded}">{humanReadableNumber(counts.uploaded)}</span>
@@ -67,15 +67,20 @@
67
67
 
68
68
  {{{ if (loggedIn && (!isSelf && !banned)) }}}
69
69
  <hr class="w-100 my-2"/>
70
- <a href="#" component="account/flag" class="btn-ghost-sm ff-secondary">
70
+
71
+ <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}}}">
71
72
  <i class="flex-shrink-0 fa-solid fa-flag text-danger"></i>
72
73
  <div class="flex-grow-1 text-nowrap">[[user:flag-profile]]</div>
73
74
  </a>
74
- <a href="#" component="account/block" class="btn-ghost-sm ff-secondary {{{ if isBlocked }}}hidden{{{ end }}}">
75
+ <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}">
76
+ <i class="flex-shrink-0 fa-solid fa-flag text-danger"></i>
77
+ <div class="flex-grow-1 text-nowrap">[[user:profile-flagged]]</div>
78
+ </a>
79
+ <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 }}}">
75
80
  <i class="flex-shrink-0 fa-solid fa-ban text-danger"></i>
76
81
  <div class="flex-grow-1 text-nowrap">[[user:block-user]]</div>
77
82
  </a>
78
- <a href="#" component="account/unblock" class="btn-ghost-sm ff-secondary {{{ if !isBlocked }}}hidden{{{ end }}}">
83
+ <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 }}}">
79
84
  <i class="flex-shrink-0 fa-solid fa-ban text-danger"></i>
80
85
  <div class="flex-grow-1 text-nowrap">[[user:unblock-user]]</div>
81
86
  </a>
@@ -83,18 +88,18 @@
83
88
 
84
89
  {{{ if canEdit }}}
85
90
  <hr class="w-100 my-2"/>
86
- <a href="{config.relative_path}/user/{userslug}/edit" class="btn-ghost-sm ff-secondary text-xs
91
+ <a href="{config.relative_path}/user/{userslug}/edit" class="btn btn-ghost btn-sm ff-secondary text-xs text-start
87
92
  {{{ if template.account/edit }}}active{{{ end }}}">
88
93
  <div class="flex-grow-1">[[user:edit-profile]]</div>
89
94
  </a>
90
- <a href="{config.relative_path}/user/{userslug}/settings" class="btn-ghost-sm ff-secondary text-xs
95
+ <a href="{config.relative_path}/user/{userslug}/settings" class="btn btn-ghost btn-sm ff-secondary text-xs text-start
91
96
  {{{ if template.account/settings }}}active{{{ end }}}">
92
97
  <div class="flex-grow-1">[[user:settings]]</div>
93
98
  </a>
94
99
  {{{ end }}}
95
100
 
96
101
  {{{ each profile_links }}}
97
- <a href="{config.relative_path}/user/{userslug}/{./route}" class="btn-ghost-sm ff-secondary text-xs plugin-link {{{ if ./public }}}public{{{ else }}}private{{{ end }}} {{{ if (url == ./url) }}}active{{{ end }}}" id="{./id}">
102
+ <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}">
98
103
  <div class="flex-grow-1">{./name}</div>
99
104
  </a>
100
105
  {{{end}}}