nodebb-theme-harmony 2.0.0-pre.22 → 2.0.0-pre.24
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.
- package/package.json +2 -2
- package/templates/account/blocks.tpl +18 -7
- package/templates/account/consent.tpl +2 -2
- package/templates/account/info.tpl +144 -75
- package/templates/flags/detail.tpl +1 -1
- package/templates/login.tpl +11 -12
- package/templates/partials/quick-search-results.tpl +1 -1
- package/templates/partials/topic/navigator.tpl +2 -2
- package/templates/partials/topic-list-bar.tpl +1 -1
- package/templates/partials/topics_list.tpl +9 -1
- package/package-lock.json +0 -2368
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nodebb-theme-harmony",
|
|
3
|
-
"version": "2.0.0-pre.
|
|
3
|
+
"version": "2.0.0-pre.24",
|
|
4
4
|
"nbbpm": {
|
|
5
5
|
"compatibility": "^3.7.0"
|
|
6
6
|
},
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"@fontsource/poppins": "5.0.8"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"eslint": "^
|
|
44
|
+
"eslint": "^9.0.0",
|
|
45
45
|
"eslint-config-nodebb": "^0.2.0",
|
|
46
46
|
"eslint-plugin-import": "^2.24.2"
|
|
47
47
|
}
|
|
@@ -7,14 +7,21 @@
|
|
|
7
7
|
<input class="form-control form-control-sm" type="text" id="user-search" placeholder="[[users:enter-username]]" data-bs-toggle="dropdown" autocomplete="off" aria-haspopup="true" aria-expanded="false"/>
|
|
8
8
|
|
|
9
9
|
<ul component="blocks/search/list" class="dropdown-menu dropdown-menu-end p-1 text-sm block-edit overflow-auto" style="max-height:300px;" role="menu">
|
|
10
|
-
<li
|
|
10
|
+
<li component="blocks/start-typing">
|
|
11
|
+
<a href="#" class="dropdown-item rounded-1" role="menuitem">[[admin/menu:search.start-typing]]</a>
|
|
12
|
+
</li>
|
|
13
|
+
<li component="blocks/no-users" class="hidden">
|
|
14
|
+
<a href="#" class="dropdown-item rounded-1" role="menuitem">[[users:no-users-found]]</a>
|
|
15
|
+
</li>
|
|
11
16
|
{{{ each edit }}}
|
|
12
|
-
<li>
|
|
13
|
-
<div class="dropdown-item d-flex flex-nowrap gap-
|
|
17
|
+
<li component="blocks/search/match">
|
|
18
|
+
<div class="dropdown-item rounded-1 d-flex flex-nowrap gap-4 justify-content-between align-items-center" role="menuitem">
|
|
14
19
|
<div class="text-truncate">
|
|
15
20
|
<a href="{config.relative_path}/uid/{./uid}" class="text-decoration-none">{buildAvatar(edit, "24px", true)} {./username}</a>
|
|
16
21
|
</div>
|
|
17
|
-
|
|
22
|
+
|
|
23
|
+
<button class="btn btn-sm btn-outline-danger text-nowrap {{{ if ./isBlocked }}}hidden{{{ end }}}" data-uid="{./uid}" data-action="block">[[user:block-user]]</button>
|
|
24
|
+
<button class="btn btn-sm btn-outline-primary text-nowrap {{{ if !./isBlocked }}}hidden{{{ end }}}" data-uid="{./uid}" data-action="unblock">[[user:unblock-user]]</button>
|
|
18
25
|
</div>
|
|
19
26
|
</li>
|
|
20
27
|
{{{ end }}}
|
|
@@ -28,12 +35,16 @@
|
|
|
28
35
|
</div>
|
|
29
36
|
</div>
|
|
30
37
|
<div class="users">
|
|
31
|
-
<div
|
|
38
|
+
<div class="alert alert-warning text-center m-0"{{{ if users.length }}} style="display: none;"{{{ end }}}>[[user:has-no-blocks]]</div>
|
|
39
|
+
|
|
40
|
+
<div id="users-container" class="row row-cols-2 row-cols-lg-3 row-cols-xl-4 g-3">
|
|
32
41
|
{{{ each users }}}
|
|
33
|
-
|
|
42
|
+
<div class="d-flex flex-column gap-1">
|
|
43
|
+
<!-- IMPORT partials/users/item.tpl -->
|
|
44
|
+
<button class="btn btn-sm btn-outline-primary text-nowrap mx-auto" data-uid="{./uid}" data-action="unblock">[[user:unblock-user]]</button>
|
|
45
|
+
</div>
|
|
34
46
|
{{{ end }}}
|
|
35
47
|
</div>
|
|
36
|
-
<div class="alert alert-warning text-center"{{{ if users.length }}} style="display: none;"{{{ end }}}>[[user:has-no-blocks]]</div>
|
|
37
48
|
<!-- IMPORT partials/paginator.tpl -->
|
|
38
49
|
</div>
|
|
39
50
|
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
<div class="row">
|
|
10
10
|
<div class="col-sm-6">
|
|
11
11
|
{{{ if gdpr_consent }}}
|
|
12
|
-
<div class="alert alert-success">
|
|
13
|
-
<i class="fa fa-check float-end fa-3x"></i>
|
|
12
|
+
<div class="alert alert-success d-flex gap-3">
|
|
14
13
|
[[user:consent.received]]
|
|
14
|
+
<i class="fa fa-check fa-3x"></i>
|
|
15
15
|
</div>
|
|
16
16
|
{{{ else }}}
|
|
17
17
|
<div class="alert alert-warning">
|
|
@@ -29,32 +29,91 @@
|
|
|
29
29
|
[[user:info.username-history]]
|
|
30
30
|
</h5>
|
|
31
31
|
<div class="card-body">
|
|
32
|
-
<ul class="list-
|
|
33
|
-
{{{each usernames}}}
|
|
34
|
-
<li class="
|
|
35
|
-
{
|
|
36
|
-
|
|
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-
|
|
49
|
-
{{{each emails}}}
|
|
50
|
-
<li class="
|
|
51
|
-
{
|
|
52
|
-
<
|
|
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
|
-
<
|
|
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
|
|
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>
|
|
102
|
-
<
|
|
103
|
-
<
|
|
104
|
-
|
|
105
|
-
<
|
|
106
|
-
|
|
107
|
-
|
|
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>
|
|
201
|
+
<p class="">
|
|
108
202
|
{{{ if ./until }}}
|
|
109
|
-
<span class="expiry">[[user:info.banned-until, {./
|
|
203
|
+
<span class="expiry">[[user:info.banned-until, {isoTimeToLocaleString(./untilISO, config.userLang)}]]</span>
|
|
110
204
|
{{{ else }}}
|
|
111
|
-
|
|
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>
|
|
143
|
-
<
|
|
144
|
-
<
|
|
145
|
-
|
|
146
|
-
<
|
|
147
|
-
|
|
148
|
-
|
|
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>
|
|
255
|
+
<p class="">
|
|
149
256
|
{{{ if ./until }}}
|
|
150
|
-
<span class="expiry">[[user:info.muted-until, {./
|
|
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
|
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
<div class="d-flex gap-2 align-items-center">
|
|
88
88
|
<a class="d-flex text-decoration-none" href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "16px", true)}</a>
|
|
89
89
|
<a href="{config.relative_path}/user/{./user.userslug}">{./user.username}</a>
|
|
90
|
-
<span class="timeago text-muted" title="{./datetimeISO}"></span>
|
|
90
|
+
<span class="timeago text-muted text-nowrap" title="{./datetimeISO}"></span>
|
|
91
91
|
</div>
|
|
92
92
|
<div>
|
|
93
93
|
<ul class="list-unstyled">
|
package/templates/login.tpl
CHANGED
|
@@ -15,26 +15,20 @@
|
|
|
15
15
|
<label for="username">{allowLoginWith}</label>
|
|
16
16
|
<input class="form-control" type="text" placeholder="{allowLoginWith}" name="username" id="username" autocorrect="off" autocapitalize="off" autocomplete="nickname" value="{username}" aria-required="true"/>
|
|
17
17
|
</div>
|
|
18
|
+
|
|
18
19
|
<div class="mb-2 d-flex flex-column gap-2">
|
|
19
|
-
<
|
|
20
|
-
<label for="password">[[user:password]]</label>
|
|
21
|
-
{{{ if allowPasswordReset }}}
|
|
22
|
-
<a id="reset-link" class="text-sm text-reset text-decoration-underline" href="{config.relative_path}/reset">[[login:forgot-password]]</a>
|
|
23
|
-
{{{ end }}}
|
|
24
|
-
</div>
|
|
20
|
+
<label for="password">[[user:password]]</label>
|
|
25
21
|
<div>
|
|
26
22
|
<input class="form-control" type="password" placeholder="[[user:password]]" name="password" id="password" autocomplete="current-password" autocapitalize="off" aria-required="true"/>
|
|
27
23
|
<p id="caps-lock-warning" class="text-danger hidden text-sm mb-0 form-text" aria-live="polite" role="alert" aria-atomic="true">
|
|
28
24
|
<i class="fa fa-exclamation-triangle"></i> [[login:caps-lock-enabled]]
|
|
29
25
|
</p>
|
|
30
26
|
</div>
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
<label>
|
|
35
|
-
<input type="checkbox" name="remember" id="remember" checked /> [[login:remember-me]]
|
|
36
|
-
</label>
|
|
27
|
+
{{{ if allowPasswordReset }}}
|
|
28
|
+
<div>
|
|
29
|
+
<a id="reset-link" class="text-sm text-reset text-decoration-underline" href="{config.relative_path}/reset">[[login:forgot-password]]</a>
|
|
37
30
|
</div>
|
|
31
|
+
{{{ end }}}
|
|
38
32
|
</div>
|
|
39
33
|
|
|
40
34
|
{{{ each loginFormEntry }}}
|
|
@@ -49,6 +43,11 @@
|
|
|
49
43
|
|
|
50
44
|
<button class="btn btn-primary" id="login" type="submit">[[global:login]]</button>
|
|
51
45
|
|
|
46
|
+
<div class="form-check mb-2">
|
|
47
|
+
<input class="form-check-input" type="checkbox" name="remember" id="remember" checked />
|
|
48
|
+
<label class="form-check-label" for="remember">[[login:remember-me]]</label>
|
|
49
|
+
</div>
|
|
50
|
+
|
|
52
51
|
<div class="alert alert-danger {{{ if !error }}} hidden{{{ end }}}" id="login-error-notify" role="alert" aria-atomic="true">
|
|
53
52
|
<strong>[[login:failed-login-attempt]]</strong>
|
|
54
53
|
<p class="mb-0">{error}</p>
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
</div>
|
|
10
10
|
{{{ end }}}
|
|
11
11
|
|
|
12
|
-
<ul id="quick-search-results" class="quick-search-results list-unstyled mb-0 p-0 pe-1 overflow-auto overscroll-behavior-contain ff-base ghost-scrollbar" style="max-width:
|
|
12
|
+
<ul id="quick-search-results" class="quick-search-results list-unstyled mb-0 p-0 pe-1 overflow-auto overscroll-behavior-contain ff-base ghost-scrollbar" style="max-width: {dropdown.maxWidth}; max-height: {dropdown.maxHeight};">
|
|
13
13
|
<li role="separator" class="dropdown-divider d-none d-md-block"></li>
|
|
14
14
|
{{{ each posts }}}
|
|
15
15
|
<li data-tid="{posts.topic.tid}" data-pid="{posts.pid}" class="d-flex flex-column gap-1">
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<div class="d-flex justify-content-end sticky-top mt-4" style="top:6rem;z-index:1;">
|
|
3
3
|
<div class="ps-1 ps-md-0 d-inline-block">
|
|
4
4
|
<div class="scroller-content d-flex gap-2 flex-column align-items-start">
|
|
5
|
-
<
|
|
5
|
+
<button class="pagetop btn-ghost-sm ff-secondary d-inline-flex border-0" style="padding: 4px;"><i class="fa fa-chevron-up"></i> <span class="timeago text-xs text-muted text-nowrap" title="{./timestampISO}"></span></button>
|
|
6
6
|
<div class="scroller-container position-relative">
|
|
7
7
|
<div class="scroller-thumb d-flex gap-2 text-nowrap position-relative" style="height: 40px;">
|
|
8
8
|
<div class="scroller-thumb-icon bg-primary rounded d-inline-block" style="width:9px; height: 40px;"></div>
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
</div>
|
|
19
19
|
</div>
|
|
20
20
|
</div>
|
|
21
|
-
<
|
|
21
|
+
<button class="pagebottom btn-ghost-sm ff-secondary d-inline-flex border-0" style="padding: 4px;"><i class="fa fa-chevron-down"></i> <span class="timeago text-xs text-muted text-nowrap" title="{./lastposttimeISO}"></span></button>
|
|
22
22
|
</div>
|
|
23
23
|
</div>
|
|
24
24
|
</div>
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<a class="btn-ghost-sm d-none d-lg-flex align-self-stretch" target="_blank" href="{rssFeedUrl}" itemprop="item" title="[[global:rss-feed]]"><i class="fa fa-rss text-primary"></i></a>
|
|
31
31
|
{{{ end }}}
|
|
32
32
|
|
|
33
|
-
<a href="{
|
|
33
|
+
<a href="{{{ if (template.category || template.world) }}}{url}{{{ else }}}{config.relative_path}/{selectedFilter.url}{querystring}{{{ end }}}" class="btn btn-secondary fw-semibold position-absolute top-100 translate-middle-x start-50 mt-1 hide" style="--bs-btn-padding-y: .25rem; --bs-btn-padding-x: .5rem; --bs-btn-font-size: .75rem;" id="new-topics-alert">
|
|
34
34
|
<i class="fa fa-fw fa-arrow-up"></i> [[recent:load-new-posts]]
|
|
35
35
|
</a>
|
|
36
36
|
</div>
|
|
@@ -24,6 +24,14 @@
|
|
|
24
24
|
<a class="text-reset" href="{{{ if topics.noAnchor }}}#{{{ else }}}{config.relative_path}/topic/{./slug}{{{ if ./bookmark }}}/{./bookmark}{{{ end }}}{{{ end }}}">{./title}</a>
|
|
25
25
|
</h3>
|
|
26
26
|
<span component="topic/labels" class="d-flex flex-wrap gap-1 w-100">
|
|
27
|
+
<span component="topic/watched" class="badge border border-gray-300 text-body {{{ if !./followed }}}hidden{{{ end }}}">
|
|
28
|
+
<i class="fa fa-bell-o"></i>
|
|
29
|
+
<span>[[topic:watching]]</span>
|
|
30
|
+
</span>
|
|
31
|
+
<span component="topic/ignored" class="badge border border-gray-300 text-body {{{ if !./ignored }}}hidden{{{ end }}}">
|
|
32
|
+
<i class="fa fa-eye-slash"></i>
|
|
33
|
+
<span>[[topic:ignoring]]</span>
|
|
34
|
+
</span>
|
|
27
35
|
<span component="topic/scheduled" class="badge border border-gray-300 text-body {{{ if !./scheduled }}}hidden{{{ end }}}">
|
|
28
36
|
<i class="fa fa-clock-o"></i>
|
|
29
37
|
<span>[[topic:scheduled]]</span>
|
|
@@ -106,7 +114,7 @@
|
|
|
106
114
|
{{{ else }}}
|
|
107
115
|
{{{ if ./teaser.pid }}}
|
|
108
116
|
<div class="ps-2">
|
|
109
|
-
<a href="{config.relative_path}/user/{./teaser.user.userslug}" class="text-decoration-none">{buildAvatar(./teaser.user, "18px", true, "avatar-tooltip not-responsive")}</a>
|
|
117
|
+
<a href="{{{ if ./teaser.user.userslug }}}{config.relative_path}/user/{./teaser.user.userslug}{{{ else }}}#{{{ end }}}" class="text-decoration-none">{buildAvatar(./teaser.user, "18px", true, "avatar-tooltip not-responsive")}</a>
|
|
110
118
|
<a class="permalink text-muted timeago text-xs" href="{config.relative_path}/topic/{./slug}/{./teaser.index}" title="{./teaser.timestampISO}" aria-label="[[global:lastpost]]"></a>
|
|
111
119
|
</div>
|
|
112
120
|
<div class="post-content text-xs ps-2 line-clamp-sm-2 lh-sm text-break position-relative flex-fill">
|