nodebb-theme-harmony 2.2.72 → 3.0.0-beta.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.
- package/package.json +2 -2
- package/templates/account/blocks.tpl +1 -1
- package/templates/account/info.tpl +7 -7
- package/templates/account/profile.tpl +3 -3
- package/templates/account/settings.tpl +3 -3
- package/templates/category.tpl +4 -4
- package/templates/groups/details.tpl +2 -2
- package/templates/header.tpl +2 -2
- package/templates/partials/account/category-item.tpl +2 -2
- package/templates/partials/account/header.tpl +1 -1
- package/templates/partials/account/session-list.tpl +1 -1
- package/templates/partials/breadcrumbs-json-ld.tpl +1 -1
- package/templates/partials/breadcrumbs.tpl +1 -1
- package/templates/partials/buttons/newTopic.tpl +1 -1
- package/templates/partials/categories/item.tpl +2 -2
- package/templates/partials/categories/lastpost.tpl +2 -2
- package/templates/partials/categories/link.tpl +2 -2
- package/templates/partials/groups/invited.tpl +1 -1
- package/templates/partials/groups/memberlist.tpl +1 -1
- package/templates/partials/groups/pending.tpl +1 -1
- package/templates/partials/mobile-nav.tpl +1 -1
- package/templates/partials/notifications_list.tpl +1 -1
- package/templates/partials/posts_list_item.tpl +3 -3
- package/templates/partials/quick-category-search-results.tpl +2 -2
- package/templates/partials/quick-search-results.tpl +1 -1
- package/templates/partials/search-filters.tpl +2 -2
- package/templates/partials/search-results.tpl +1 -1
- package/templates/partials/sidebar/user-menu.tpl +1 -1
- package/templates/partials/sidebar-left.tpl +4 -4
- package/templates/partials/toast.tpl +2 -2
- package/templates/partials/topic/event.tpl +2 -2
- package/templates/partials/topic/navigation-post.tpl +2 -2
- package/templates/partials/topic/necro-post.tpl +1 -1
- package/templates/partials/topic/post.tpl +7 -7
- package/templates/partials/topic/quickreply.tpl +1 -1
- package/templates/partials/topic/sort.tpl +1 -1
- package/templates/partials/topics_list.tpl +6 -6
- package/templates/partials/users/item.tpl +1 -1
- package/templates/topic.tpl +2 -18
- package/templates/world.tpl +4 -4
package/package.json
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
<li component="blocks/search/match">
|
|
18
18
|
<div class="dropdown-item rounded-1 d-flex flex-nowrap gap-4 justify-content-between align-items-center" role="menuitem">
|
|
19
19
|
<div class="text-truncate">
|
|
20
|
-
<a href="{config.relative_path}/uid/{./uid}" class="text-decoration-none">{buildAvatar(edit, "24px", true)} {./username}</a>
|
|
20
|
+
<a href="{config.relative_path}/uid/{./uid}" class="text-decoration-none">{{buildAvatar(edit, "24px", true)}} {./username}</a>
|
|
21
21
|
</div>
|
|
22
22
|
|
|
23
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>
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
<div class="mb-4 pb-3 border-bottom">
|
|
16
16
|
<h6>[[user:info.invited-by]]</h6>
|
|
17
17
|
<div class="d-flex align-items-center gap-2">
|
|
18
|
-
<a href="">{buildAvatar(invitedBy, "24px", true)}</a>
|
|
18
|
+
<a href="">{{buildAvatar(invitedBy, "24px", true)}}</a>
|
|
19
19
|
<a href="">{invitedBy.username}</a>
|
|
20
20
|
</div>
|
|
21
21
|
</div>
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
<div>
|
|
44
44
|
{{{ if ./byUid }}}
|
|
45
45
|
<a class="lh-1" href="{{{ if ./byUser.userslug }}}{config.relative_path}/user/{./byUser.userslug}{{{ else }}}#{{{ end }}}">
|
|
46
|
-
{buildAvatar(./byUser, "18px", true)}</a>
|
|
46
|
+
{{buildAvatar(./byUser, "18px", true)}}</a>
|
|
47
47
|
{{{ end }}}
|
|
48
48
|
<span class="timeago text-sm text-secondary lh-1 align-middle" title="{./timestampISO}"></span>
|
|
49
49
|
</div>
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
<div>
|
|
64
64
|
{{{ if ./byUid }}}
|
|
65
65
|
<a class="lh-1" href="{{{ if ./byUser.userslug }}}{config.relative_path}/user/{./byUser.userslug}{{{ else }}}#{{{ end }}}">
|
|
66
|
-
{buildAvatar(./byUser, "18px", true)}</a>
|
|
66
|
+
{{buildAvatar(./byUser, "18px", true)}}</a>
|
|
67
67
|
{{{ end }}}
|
|
68
68
|
<span class="timeago text-sm text-secondary lh-1 align-middle" title="{./timestampISO}"></span>
|
|
69
69
|
</div>
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
<span class="text-sm">[[user:info.reported-by]]</span>
|
|
108
108
|
<div class="d-flex text-nowrap">
|
|
109
109
|
{{{ each ./reports }}}
|
|
110
|
-
<a style="width: 18px; z-index: 3;" class="text-decoration-none" href="{config.relative_path}/user/{./reporter.userslug}">{buildAvatar(./reporter, "24px", true)}</a>
|
|
110
|
+
<a style="width: 18px; z-index: 3;" class="text-decoration-none" href="{config.relative_path}/user/{./reporter.userslug}">{{buildAvatar(./reporter, "24px", true)}}</a>
|
|
111
111
|
{{{ end }}}
|
|
112
112
|
</div>
|
|
113
113
|
</div>
|
|
@@ -138,7 +138,7 @@
|
|
|
138
138
|
<li class="mb-4 border-bottom">
|
|
139
139
|
<div class="mb-1 d-flex align-items-center justify-content-between">
|
|
140
140
|
<div>
|
|
141
|
-
<a href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "24px", true)}</a>
|
|
141
|
+
<a href="{config.relative_path}/user/{./user.userslug}">{{buildAvatar(./user, "24px", true)}}</a>
|
|
142
142
|
<strong>
|
|
143
143
|
<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>
|
|
144
144
|
</strong>
|
|
@@ -192,7 +192,7 @@
|
|
|
192
192
|
<li class="mb-4 border-bottom">
|
|
193
193
|
<div class="mb-1 d-flex align-items-center justify-content-between">
|
|
194
194
|
<div>
|
|
195
|
-
<a href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "24px", true)}</a>
|
|
195
|
+
<a href="{config.relative_path}/user/{./user.userslug}">{{buildAvatar(./user, "24px", true)}}</a>
|
|
196
196
|
<strong>
|
|
197
197
|
<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>
|
|
198
198
|
</strong>
|
|
@@ -240,7 +240,7 @@
|
|
|
240
240
|
|
|
241
241
|
<div data-id="{./id}">
|
|
242
242
|
<div class="d-flex align-items-baseline gap-1 mb-1">
|
|
243
|
-
<a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">{buildAvatar(./user, "24px", true)}</a>
|
|
243
|
+
<a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">{{buildAvatar(./user, "24px", true)}}</a>
|
|
244
244
|
|
|
245
245
|
<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>
|
|
246
246
|
|
|
@@ -3,21 +3,21 @@
|
|
|
3
3
|
{{{ if widgets.profile-aboutme-before.length }}}
|
|
4
4
|
<div data-widget-area="profile-aboutme-before">
|
|
5
5
|
{{{each widgets.profile-aboutme-before}}}
|
|
6
|
-
{./html}
|
|
6
|
+
{{./html}}
|
|
7
7
|
{{{end}}}
|
|
8
8
|
</div>
|
|
9
9
|
{{{ end }}}
|
|
10
10
|
|
|
11
11
|
{{{ if aboutme }}}
|
|
12
12
|
<div component="aboutme" class="text-sm text-break">
|
|
13
|
-
{aboutmeParsed}
|
|
13
|
+
{{aboutmeParsed}}
|
|
14
14
|
</div>
|
|
15
15
|
{{{ end }}}
|
|
16
16
|
|
|
17
17
|
{{{ if widgets.profile-aboutme-after.length }}}
|
|
18
18
|
<div data-widget-area="profile-aboutme-after">
|
|
19
19
|
{{{each widgets.profile-aboutme-after}}}
|
|
20
|
-
{./html}
|
|
20
|
+
{{./html}}
|
|
21
21
|
{{{end}}}
|
|
22
22
|
</div>
|
|
23
23
|
{{{ end }}}
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
<div component="chat/allow/list" class="d-flex flex-wrap gap-2 mb-2">
|
|
68
68
|
{{{ each settings.chatAllowListUsers }}}
|
|
69
69
|
<div component="chat/allow/list/user" data-uid="{./uid}" class="d-flex px-2 py-1 rounded-1 text-bg-light gap-2 align-items-center text-sm">
|
|
70
|
-
{buildAvatar(@value, "16px", true)} {./username}
|
|
70
|
+
{{buildAvatar(@value, "16px", true)}} {./username}
|
|
71
71
|
<button component="chat/allow/delete" data-uid="{./uid}" class="btn btn-light btn-sm py-0"><i class="fa fa-times fa-xs text-danger"></i></button>
|
|
72
72
|
</div>
|
|
73
73
|
{{{ end }}}
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
<div component="chat/deny/list" class="d-flex flex-wrap gap-2 mb-2">
|
|
83
83
|
{{{ each settings.chatDenyListUsers }}}
|
|
84
84
|
<div component="chat/deny/list/user" data-uid="{./uid}" class="d-flex px-2 py-1 rounded-1 text-bg-light gap-2 align-items-center text-sm">
|
|
85
|
-
{buildAvatar(@value, "16px", true)} {./username}
|
|
85
|
+
{{buildAvatar(@value, "16px", true)}} {./username}
|
|
86
86
|
<button component="chat/deny/delete" data-uid="{./uid}" class="btn btn-light btn-sm py-0"><i class="fa fa-times fa-xs text-danger"></i></button>
|
|
87
87
|
</div>
|
|
88
88
|
{{{ end }}}
|
|
@@ -189,7 +189,7 @@
|
|
|
189
189
|
<hr/>
|
|
190
190
|
<h6 class="fw-bold">{./title}</h6>
|
|
191
191
|
<div>
|
|
192
|
-
{./content}
|
|
192
|
+
{{./content}}
|
|
193
193
|
</div>
|
|
194
194
|
{{{end}}}
|
|
195
195
|
<hr class="d-block d-md-none"/>
|
package/templates/category.tpl
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
|
|
6
6
|
<div class="category-header d-flex flex-column gap-2">
|
|
7
7
|
<div class="d-flex gap-3 align-items-center mb-1 {{{ if config.theme.centerHeaderElements }}}justify-content-center flex-column{{{ end }}}">
|
|
8
|
-
{buildCategoryIcon(@value, "60px", "rounded-1 flex-shrink-0")}
|
|
8
|
+
{{buildCategoryIcon(@value, "60px", "rounded-1 flex-shrink-0")}}
|
|
9
9
|
<div class="d-flex flex-column gap-1">
|
|
10
|
-
<h1 class="tracking-tight fs-3 fw-semibold mb-0">{./name}</h1>
|
|
10
|
+
<h1 class="tracking-tight fs-3 fw-semibold mb-0">{tx(./name)}</h1>
|
|
11
11
|
<div class="d-flex flex-wrap gap-2 align-items-center {{{ if config.theme.centerHeaderElements }}}justify-content-center{{{ end }}}">
|
|
12
12
|
<span class="badge text-body border border-gray-300 stats text-xs">
|
|
13
13
|
<span title="{formattedNumber(totalTopicCount)}" class="fw-bold">{humanReadableNumber(totalTopicCount)}</span>
|
|
@@ -31,12 +31,12 @@
|
|
|
31
31
|
</div>
|
|
32
32
|
{{{ if ./descriptionParsed }}}
|
|
33
33
|
<div class="description text-secondary text-sm lh-sm w-100 {{{ if config.theme.centerHeaderElements }}}text-center{{{ end }}} line-clamp-4 clamp-fade-sm-4">
|
|
34
|
-
{./descriptionParsed}
|
|
34
|
+
{{./descriptionParsed}}
|
|
35
35
|
</div>
|
|
36
36
|
{{{ end }}}
|
|
37
37
|
{{{ if ./handleFull }}}
|
|
38
38
|
<p class="text-secondary text-sm fst-italic mb-0 {{{ if config.theme.centerHeaderElements }}}text-center{{{ end }}}">
|
|
39
|
-
[[category:handle.description, {
|
|
39
|
+
[[category:handle.description, {handleFull}]]
|
|
40
40
|
<a href="#" class="link-secondary" data-action="copy" data-clipboard-text="{handleFull}"><i class="fa fa-fw fa-copy" aria-hidden="true"></i></a>
|
|
41
41
|
</p>
|
|
42
42
|
{{{ end }}}
|
|
@@ -23,12 +23,12 @@
|
|
|
23
23
|
</div>
|
|
24
24
|
</div>
|
|
25
25
|
<div>
|
|
26
|
-
{group.descriptionParsed}
|
|
26
|
+
{{group.descriptionParsed}}
|
|
27
27
|
</div>
|
|
28
28
|
</div>
|
|
29
29
|
<div class="d-flex gap-2 align-items-start">
|
|
30
30
|
{{{ if loggedIn }}}
|
|
31
|
-
{membershipBtn(group)}
|
|
31
|
+
{{membershipBtn(group)}}
|
|
32
32
|
{{{ end }}}
|
|
33
33
|
{{{ if isAdmin }}}
|
|
34
34
|
<a href="{config.relative_path}/admin/manage/groups/{group.slug}" target="_blank" class="btn btn-light text-nowrap"><i class="fa fa-gear"></i> [[user:edit]]</a>
|
package/templates/header.tpl
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
<html lang="{localeToHTML(userLang, defaultLang)}" {{{if languageDirection}}}data-dir="{languageDirection}" style="direction: {languageDirection};"{{{end}}}>
|
|
3
3
|
<head>
|
|
4
4
|
<title>{browserTitle}</title>
|
|
5
|
-
{{{each metaTags}}}{buildMetaTag(@value)}{{{end}}}
|
|
5
|
+
{{{each metaTags}}}{{buildMetaTag(@value)}}{{{end}}}
|
|
6
6
|
<link rel="stylesheet" type="text/css" href="{relative_path}/assets/client{{{if bootswatchSkin}}}-{bootswatchSkin}{{{end}}}{{{ if (languageDirection=="rtl") }}}-rtl{{{ end }}}.css?{config.cache-buster}" />
|
|
7
|
-
{{{each linkTags}}}{buildLinkTag(@value)}{{{end}}}
|
|
7
|
+
{{{each linkTags}}}{{buildLinkTag(@value)}}{{{end}}}
|
|
8
8
|
|
|
9
9
|
<script>
|
|
10
10
|
var config = JSON.parse('{{configJSON}}');
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
<div class="content depth-{./depth} d-flex gap-2">
|
|
4
4
|
<div class="flex-grow-1 align-items-start d-flex gap-2">
|
|
5
5
|
<div>
|
|
6
|
-
{buildCategoryIcon(@value, "24px", "rounded-1")}
|
|
6
|
+
{{buildCategoryIcon(@value, "24px", "rounded-1")}}
|
|
7
7
|
</div>
|
|
8
8
|
<div class="d-grid gap-0">
|
|
9
9
|
<div class="title fw-semibold">
|
|
10
10
|
<!-- IMPORT partials/categories/link.tpl -->
|
|
11
11
|
</div>
|
|
12
12
|
{{{ if ./descriptionParsed }}}
|
|
13
|
-
<div class="description text-muted text-xs w-100 line-clamp-sm-5">{./descriptionParsed}</div>
|
|
13
|
+
<div class="description text-muted text-xs w-100 line-clamp-sm-5">{{./descriptionParsed}}</div>
|
|
14
14
|
{{{ end }}}
|
|
15
15
|
</div>
|
|
16
16
|
</div>
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
<div class="d-flex flex-column flex-md-row gap-2 w-100 pb-4 mb-4 mt-2 border-bottom">
|
|
17
17
|
<div {{{ if (allowProfilePicture && isSelfOrAdminOrGlobalModerator)}}}component="profile/change/picture"{{{ end }}} class="avatar-wrapper bg-body rounded-circle position-relative align-self-center align-self-md-start hover-parent" style="margin-top: -75px; padding: 4px;">
|
|
18
|
-
{buildAvatar(@value, "142px", true)}
|
|
18
|
+
{{buildAvatar(@value, "142px", true)}}
|
|
19
19
|
{{{ if (allowProfilePicture && isSelfOrAdminOrGlobalModerator)}}}
|
|
20
20
|
<a href="#" component="profile/change/picture" class="d-none d-md-block pointer p-2 rounded-1 text-bg-light position-absolute top-50 start-50 translate-middle hover-opacity-75">
|
|
21
21
|
<span class="upload"><i class="fa fa-fw fa-upload"></i></span>
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<button class="btn btn-sm btn-outline-secondary" type="button" data-action="revokeSession">[[user:revoke-session]]</button>
|
|
7
7
|
{{{ end }}}
|
|
8
8
|
{{{ end }}}
|
|
9
|
-
{userAgentIcons(@value)}
|
|
9
|
+
{{userAgentIcons(@value)}}
|
|
10
10
|
<i class="fa fa-circle text-{{{ if ./current }}}success{{{ else }}}muted{{{ end }}}"></i>
|
|
11
11
|
</div>
|
|
12
12
|
[[user:browser-version-on-platform, {./browser}, {./version}, {./platform}]]<br />
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
{{{ each breadcrumbs }}}{{{ if !@first}}},{
|
|
11
11
|
"@type": "ListItem",
|
|
12
12
|
"position": {increment(@index, "1")},
|
|
13
|
-
"name": "{stripTags(./text)}"
|
|
13
|
+
"name": "{stripTags(tx(./text))}"
|
|
14
14
|
{{{ if !@last }}},"item": "{./url}"{{{ end }}}
|
|
15
15
|
}{{{ end }}}{{{ end }}}
|
|
16
16
|
]}</script>
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<li{{{ if @last }}} component="breadcrumb/current"{{{ end }}} itemscope="itemscope" itemprop="itemListElement" itemtype="http://schema.org/ListItem" class="breadcrumb-item {{{ if @last }}}active{{{ end }}}">
|
|
5
5
|
<meta itemprop="position" content="{increment(@index, "1")}" />
|
|
6
6
|
{{{ if ./url }}}<a href="{./url}" itemprop="item">{{{ end }}}
|
|
7
|
-
<span class="fw-semibold" itemprop="name">{./text}</span>
|
|
7
|
+
<span class="fw-semibold" itemprop="name">{tx(./text)}</span>
|
|
8
8
|
{{{ if ./url }}}</a>{{{ end }}}
|
|
9
9
|
</li>
|
|
10
10
|
{{{ end }}}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
<a role="menu-item" href="{config.relative_path}/compose?cid={categories.cid}">{categories.level}
|
|
11
11
|
<span component="category-markup">
|
|
12
12
|
<div class="category-item d-inline-block">
|
|
13
|
-
{buildCategoryIcon(@value, "24px", "rounded-circle")}
|
|
13
|
+
{{buildCategoryIcon(@value, "24px", "rounded-circle")}}
|
|
14
14
|
{categories.name}
|
|
15
15
|
</div>
|
|
16
16
|
</span>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
<div class="d-flex col-lg-7 gap-2 gap-lg-3">
|
|
5
5
|
<div class="flex-shrink-0">
|
|
6
|
-
{buildCategoryIcon(@value, "40px", "rounded-1")}
|
|
6
|
+
{{buildCategoryIcon(@value, "40px", "rounded-1")}}
|
|
7
7
|
</div>
|
|
8
8
|
<div class="flex-grow-1 d-flex flex-wrap gap-1 me-0 me-lg-2">
|
|
9
9
|
<h2 class="title text-break fs-4 fw-semibold m-0 tracking-tight w-100">
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
</h2>
|
|
12
12
|
{{{ if ./descriptionParsed }}}
|
|
13
13
|
<div class="description text-muted text-sm w-100 line-clamp-sm-5">
|
|
14
|
-
{./descriptionParsed}
|
|
14
|
+
{{./descriptionParsed}}
|
|
15
15
|
</div>
|
|
16
16
|
{{{ end }}}
|
|
17
17
|
{{{ if !./link }}}
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
{{{ if @first }}}
|
|
4
4
|
<div component="category/posts" class="ps-2 text-xs d-flex flex-column h-100 gap-1">
|
|
5
5
|
<div class="text-nowrap text-truncate">
|
|
6
|
-
<a class="text-decoration-none avatar-tooltip" title="{./user.displayname}" href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(posts.user, "18px", true)}</a>
|
|
6
|
+
<a class="text-decoration-none avatar-tooltip" title="{./user.displayname}" href="{config.relative_path}/user/{./user.userslug}">{{buildAvatar(posts.user, "18px", true)}}</a>
|
|
7
7
|
<a class="permalink text-muted timeago text-xs" href="{config.relative_path}/topic/{./topic.slug}{{{ if ./index }}}/{./index}{{{ end }}}" title="{./timestampISO}" aria-label="[[global:lastpost]]"></a>
|
|
8
8
|
</div>
|
|
9
9
|
<div class="post-content text-xs text-break line-clamp-sm-2 lh-sm position-relative flex-fill">
|
|
10
10
|
<a class="stretched-link" tabindex="-1" href="{config.relative_path}/topic/{./topic.slug}{{{ if ./index }}}/{./index}{{{ end }}}" aria-label="[[global:lastpost]]"></a>
|
|
11
|
-
{./content}
|
|
11
|
+
{{./content}}
|
|
12
12
|
</div>
|
|
13
13
|
</div>
|
|
14
14
|
{{{ end }}}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{{{ if ./isSection }}}
|
|
2
|
-
{./name}
|
|
2
|
+
{tx(./name)}
|
|
3
3
|
{{{ else }}}
|
|
4
|
-
<a class="text-reset" href="{{{ if ./link }}}{./link}{{{ else }}}{config.relative_path}/category/{./slug}{{{ end }}}" itemprop="url">{
|
|
4
|
+
<a class="text-reset" href="{{{ if ./link }}}{./link}{{{ else }}}{config.relative_path}/category/{./slug}{{{ end }}}" itemprop="url">{tx(./name)}</a>
|
|
5
5
|
{{{ end }}}
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
<tr data-uid="{group.invited.uid}" class="align-middle">
|
|
22
22
|
<td class="member-name p-2 d-flex align-items-center justify-content-between">
|
|
23
23
|
<div class="d-flex align-items-center gap-2">
|
|
24
|
-
<a class="text-decoration-none" href="{config.relative_path}/user/{group.invited.userslug}">{buildAvatar(group.invited, "24px", true)}</a>
|
|
24
|
+
<a class="text-decoration-none" href="{config.relative_path}/user/{group.invited.userslug}">{{buildAvatar(group.invited, "24px", true)}}</a>
|
|
25
25
|
<a href="{config.relative_path}/user/{group.invited.userslug}">{group.invited.username}</a>
|
|
26
26
|
</div>
|
|
27
27
|
<button class="btn btn-outline-secondary btn-sm text-nowrap" data-action="rescindInvite">[[groups:invited.uninvite]]</button>
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
<td class="member-name p-2 w-100 ">
|
|
23
23
|
<div class="d-flex align-items-center justify-content-between">
|
|
24
24
|
<div class="d-flex align-items-center gap-2">
|
|
25
|
-
<a class="text-decoration-none" href="{config.relative_path}/user/{group.members.userslug}">{buildAvatar(group.members, "24px", true)}</a>
|
|
25
|
+
<a class="text-decoration-none" href="{config.relative_path}/user/{group.members.userslug}">{{buildAvatar(group.members, "24px", true)}}</a>
|
|
26
26
|
<a class="align-text-top" href="{config.relative_path}/user/{group.members.userslug}">{group.members.username}</a>
|
|
27
27
|
<i component="groups/owner/icon" title="[[groups:owner]]" class="user-owner-icon fa fa-star align-text-top text-warning {{{ if !group.members.isOwner }}}invisible{{{ end }}}"></i>
|
|
28
28
|
</div>
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
<tr data-uid="{group.pending.uid}" class="align-middle">
|
|
15
15
|
<td class="member-name p-2 d-flex align-items-center justify-content-between">
|
|
16
16
|
<div class="d-flex gap-2">
|
|
17
|
-
<a class="text-decoration-none" href="{config.relative_path}/user/{group.pending.userslug}">{buildAvatar(group.pending, "24px", true)}</a>
|
|
17
|
+
<a class="text-decoration-none" href="{config.relative_path}/user/{group.pending.userslug}">{{buildAvatar(group.pending, "24px", true)}}</a>
|
|
18
18
|
<a href="{config.relative_path}/user/{group.pending.userslug}">{group.pending.username}</a>
|
|
19
19
|
</div>
|
|
20
20
|
<div class="d-flex gap-2">
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
<div class="btn btn-ghost btn-sm d-flex gap-2 flex-grow-1 align-items-start text-start">
|
|
10
10
|
<a class="flex-grow-0 flex-shrink-0" href="{{{ if ./user.userslug}}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">
|
|
11
11
|
{{{ if ./user }}}
|
|
12
|
-
{buildAvatar(./user, "32px", true)}
|
|
12
|
+
{{buildAvatar(./user, "32px", true)}}
|
|
13
13
|
{{{ else }}}
|
|
14
14
|
{{{ if ./icon }}}
|
|
15
15
|
<div class="avatar avatar-rounded" style="--avatar-size: 32px;"><i class="text-secondary fa {./icon}"></i></div>
|
|
@@ -7,18 +7,18 @@
|
|
|
7
7
|
<div class="post-body d-flex flex-column gap-1 mb-2">
|
|
8
8
|
<div class="d-flex gap-2 post-info text-sm align-items-center">
|
|
9
9
|
<div class="post-author d-flex align-items-center gap-1">
|
|
10
|
-
<a class="lh-1 text-decoration-none" href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "16px", true, "not-responsive")}</a>
|
|
10
|
+
<a class="lh-1 text-decoration-none" href="{config.relative_path}/user/{./user.userslug}">{{buildAvatar(./user, "16px", true, "not-responsive")}}</a>
|
|
11
11
|
<a class="lh-1 fw-semibold" href="{config.relative_path}/user/{./user.userslug}">{../user.displayname}</a>
|
|
12
12
|
</div>
|
|
13
13
|
<span class="timeago text-muted lh-1" title="{./timestampISO}"></span>
|
|
14
14
|
</div>
|
|
15
15
|
|
|
16
16
|
<div component="post/content" class="content text-sm text-break">
|
|
17
|
-
{./content}
|
|
17
|
+
{{./content}}
|
|
18
18
|
</div>
|
|
19
19
|
</div>
|
|
20
20
|
<div class="mb-3 d-flex flex-wrap gap-1 w-100">
|
|
21
|
-
{buildCategoryLabel(./category, "a", "border")}
|
|
21
|
+
{{buildCategoryLabel(./category, "a", "border")}}
|
|
22
22
|
<span data-tid="{./topic.tid}" component="topic/tags" class="lh-1 tag-list d-flex flex-wrap gap-1 {{{ if !./topic.tags.length }}}hidden{{{ end }}}">
|
|
23
23
|
{{{ each ./topic.tags }}}
|
|
24
24
|
<a href="{config.relative_path}/tags/{./valueEncoded}"><span class="badge border border-gray-300 fw-normal tag tag-class-{./class}" data-tag="{./value}">{./valueEscaped}</span></a>
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
{{{ each categories }}}
|
|
12
12
|
<li data-cid="{./cid}" class="d-flex flex-column gap-1">
|
|
13
13
|
<div class="btn btn-ghost btn-sm ff-secondary d-flex gap-2 align-items-center rounded-1 text-start text-reset d-block text-truncate px-2 py-1 position-relative">
|
|
14
|
-
<div class="flex-shrink-0">{buildCategoryIcon(@value, "40px", "rounded-1")}</div>
|
|
14
|
+
<div class="flex-shrink-0">{{buildCategoryIcon(@value, "40px", "rounded-1")}}</div>
|
|
15
15
|
<div class="flex-grow-1" style="min-width: 0;">
|
|
16
16
|
<a class="stretched-link" href="{config.relative_path}/category/{./slug}"></a>
|
|
17
17
|
<span class="quick-search-title fw-semibold text-sm">
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
</span>
|
|
23
23
|
<br/>
|
|
24
24
|
<div class="snippet text-xs text-break text-wrap mb-0 text-sm text-secondary line-clamp-1">
|
|
25
|
-
{./descriptionParsed}
|
|
25
|
+
{{./descriptionParsed}}
|
|
26
26
|
</div>
|
|
27
27
|
</div>
|
|
28
28
|
</div>
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
</a>
|
|
22
22
|
<div class="d-flex gap-2 post-info px-2 text-xs">
|
|
23
23
|
<div class="category-item d-inline-block ff-secondary">
|
|
24
|
-
{buildCategoryLabel(posts.category, "span")}
|
|
24
|
+
{{buildCategoryLabel(posts.category, "span")}}
|
|
25
25
|
</div>
|
|
26
26
|
<span class="timeago text-muted" title="{posts.timestampISO}"></span>
|
|
27
27
|
</div>
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
<div component="user/filter/selected" class="d-flex flex-wrap gap-2">
|
|
70
70
|
{{{ each userFilterSelected }}}
|
|
71
71
|
<div class="d-flex px-2 py-1 rounded-1 text-bg-primary gap-2 align-items-center text-sm">
|
|
72
|
-
{buildAvatar(@value, "16px", true)} {./username}
|
|
72
|
+
{{buildAvatar(@value, "16px", true)}} {./username}
|
|
73
73
|
<button component="user/filter/delete" data-uid="{./uid}" class="btn btn-primary btn-sm py-0"><i class="fa fa-times fa-xs"></i></button>
|
|
74
74
|
</div>
|
|
75
75
|
{{{ end }}}
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
<hr class="my-2"/>
|
|
78
78
|
<div component="user/filter/results" class="d-flex flex-wrap gap-2">
|
|
79
79
|
{{{ each userFilterResults }}}
|
|
80
|
-
<button class="btn btn-light btn-sm border" data-uid="{./uid}" data-username="{./username}">{buildAvatar(@value, "16px", true)} {./username}</button>
|
|
80
|
+
<button class="btn btn-light btn-sm border" data-uid="{./uid}" data-username="{./username}">{{buildAvatar(@value, "16px", true)}} {./username}</button>
|
|
81
81
|
{{{ end }}}
|
|
82
82
|
</div>
|
|
83
83
|
</li>
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
<div class="post-body d-flex flex-column gap-1">
|
|
25
25
|
<div class="d-flex gap-3 post-info">
|
|
26
26
|
<div class="post-author d-flex gap-1">
|
|
27
|
-
<a class="lh-1 text-decoration-none" href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "16px", true, "not-responsive")}</a>
|
|
27
|
+
<a class="lh-1 text-decoration-none" href="{config.relative_path}/user/{./user.userslug}">{{buildAvatar(./user, "16px", true, "not-responsive")}}</a>
|
|
28
28
|
<a class="fw-semibold text-sm" href="{config.relative_path}/user/{./user.userslug}">{../user.displayname}</a>
|
|
29
29
|
</div>
|
|
30
30
|
<span class="timeago text-sm text-muted" title="{./timestampISO}"></span>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<a component="header/avatar" id="user_dropdown" href="#" role="button" class="nav-link d-flex gap-2 align-items-center text-truncate" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="[[user:user-menu]]" style="padding: 2px 4px;">
|
|
2
|
-
{buildAvatar(user, "28px", true)}
|
|
2
|
+
{{buildAvatar(user, "28px", true)}}
|
|
3
3
|
<span id="user-header-name" class="nav-text small visible-open fw-semibold">{user.username}</span>
|
|
4
4
|
</a>
|
|
5
5
|
<ul id="user-control-list" component="header/usercontrol" class="overscroll-behavior-contain user-dropdown dropdown-menu shadow p-1 text-sm ff-base" role="menu">
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
<ul id="main-nav" class="list-unstyled d-flex flex-column w-100 gap-2 mt-2 overflow-y-auto">
|
|
3
3
|
{{{ each navigation }}}
|
|
4
4
|
{{{ if displayMenuItem(@root, @index) }}}
|
|
5
|
-
<li class="nav-item mx-2 {./class}{{{ if ./dropdown }}} dropend{{{ end }}}" title="{./title}">
|
|
6
|
-
<a class="nav-link navigation-link d-flex gap-2 justify-content-between align-items-center {{{ if ./dropdown }}}dropdown-toggle{{{ end }}}" {{{ if ./dropdown }}} href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" {{{ else }}} href="{./route}"{{{ end }}} {{{ if ./id }}}id="{./id}"{{{ end }}}{{{ if ./targetBlank }}} target="_blank"{{{ end }}} {{{ if ./text }}}aria-label="{./text}"{{{ end }}}>
|
|
5
|
+
<li class="nav-item mx-2 {./class}{{{ if ./dropdown }}} dropend{{{ end }}}" title="{tx(./title)}">
|
|
6
|
+
<a class="nav-link navigation-link d-flex gap-2 justify-content-between align-items-center {{{ if ./dropdown }}}dropdown-toggle{{{ end }}}" {{{ if ./dropdown }}} href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" {{{ else }}} href="{./route}"{{{ end }}} {{{ if ./id }}}id="{./id}"{{{ end }}}{{{ if ./targetBlank }}} target="_blank"{{{ end }}} {{{ if ./text }}}aria-label="{tx(./text)}"{{{ end }}}>
|
|
7
7
|
<span class="d-flex gap-2 align-items-center text-nowrap truncate-open">
|
|
8
8
|
<span class="position-relative">
|
|
9
9
|
{{{ if ./iconClass }}}
|
|
@@ -11,13 +11,13 @@
|
|
|
11
11
|
<span component="navigation/count" class="visible-closed position-absolute top-0 start-100 translate-middle badge rounded-1 bg-primary {{{ if !./content }}}hidden{{{ end }}}">{./content}</span>
|
|
12
12
|
{{{ end }}}
|
|
13
13
|
</span>
|
|
14
|
-
{{{ if ./text }}}<span class="nav-text small visible-open fw-semibold text-truncate">{./text}</span>{{{ end }}}
|
|
14
|
+
{{{ if ./text }}}<span class="nav-text small visible-open fw-semibold text-truncate">{tx(./text)}</span>{{{ end }}}
|
|
15
15
|
</span>
|
|
16
16
|
<span component="navigation/count" class="visible-open badge rounded-1 bg-primary {{{ if !./content }}}hidden{{{ end }}}">{./content}</span>
|
|
17
17
|
</a>
|
|
18
18
|
{{{ if ./dropdown }}}
|
|
19
19
|
<ul class="dropdown-menu p-1 shadow" role="menu">
|
|
20
|
-
{./dropdownContent}
|
|
20
|
+
{{./dropdownContent}}
|
|
21
21
|
</ul>
|
|
22
22
|
{{{ end }}}
|
|
23
23
|
</li>
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
{{{ end }}}
|
|
7
7
|
<div class="d-flex flex-column gap-2">
|
|
8
8
|
{{{ if title }}}
|
|
9
|
-
<strong>{title}</strong>
|
|
9
|
+
<strong>{tx(title)}</strong>
|
|
10
10
|
{{{ end }}}
|
|
11
11
|
|
|
12
12
|
{{{ if message }}}
|
|
13
|
-
<p class="m-0">{message}</p>
|
|
13
|
+
<p class="m-0">{tx(message)}</p>
|
|
14
14
|
{{{ end }}}
|
|
15
15
|
</div>
|
|
16
16
|
</div>
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
{{{ each ./items }}}
|
|
13
13
|
<div class="d-flex gap-2 pt-3 pt-lg-2" data-topic-event-id="{./id}" data-topic-event-type="{./type}">
|
|
14
14
|
<span class="timeline-text small d-flex align-items-center gap-1 flex-wrap flex-grow-1 flex-lg-grow-0">
|
|
15
|
-
{./text}
|
|
15
|
+
{{./text}}
|
|
16
16
|
</span>
|
|
17
17
|
{{{ if (privileges.isAdminOrMod && ./id) }}}
|
|
18
18
|
<span component="topic/event/delete" data-topic-event-id="{./id}" data-topic-event-type="{./type}" class="timeline-text pointer" title="[[topic:delete-event]]"><i class="fa fa-trash"></i></span>
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<i class="fa fa-fw {{{ if ./icon }}}{./icon}{{{ else }}}fa-circle{{{ end }}} small"></i>
|
|
31
31
|
</div>
|
|
32
32
|
<span class="timeline-text small d-flex align-items-center gap-1 flex-wrap flex-grow-1 flex-lg-grow-0">
|
|
33
|
-
{./text}
|
|
33
|
+
{{./text}}
|
|
34
34
|
</span>
|
|
35
35
|
{{{ if (privileges.isAdminOrMod && ./id) }}}
|
|
36
36
|
<span component="topic/event/delete" data-topic-event-id="{./id}" data-topic-event-type="{./type}" class="timeline-text pointer" title="[[topic:delete-event]]"><i class="fa fa-trash"></i></span>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<div class="d-flex gap-2 mb-2 align-items-center flex-nowrap text-sm">
|
|
2
2
|
<div>
|
|
3
|
-
{buildAvatar(post.user, "24px", true)}
|
|
3
|
+
{{buildAvatar(post.user, "24px", true)}}
|
|
4
4
|
</div>
|
|
5
5
|
<div class="text-truncate">
|
|
6
6
|
<a href="{{{ if post.user.userslug }}}{config.relative_path}/user/{post.user.userslug}{{{else }}}#{{{ end }}}">{post.user.displayname}</a>
|
|
@@ -8,4 +8,4 @@
|
|
|
8
8
|
<span class="timeago text-nowrap text-muted" title="{post.timestampISO}"></span>
|
|
9
9
|
</div>
|
|
10
10
|
|
|
11
|
-
<div class="text-sm">{post.content}</div>
|
|
11
|
+
<div class="text-sm">{{post.content}}</div>
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
<div class="d-flex align-items-start gap-3 post-container-parent">
|
|
12
12
|
<div class="bg-body d-none d-sm-block rounded-circle" style="box-shadow: 0 0 0 3px var(--bs-body-bg);">
|
|
13
13
|
<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}]]">
|
|
14
|
-
{buildAvatar(posts.user, "48px", true, "", "user/picture")}
|
|
14
|
+
{{buildAvatar(posts.user, "48px", true, "", "user/picture")}}
|
|
15
15
|
{{{ if ./user.isLocal }}}
|
|
16
16
|
<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>
|
|
17
17
|
{{{ else }}}
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
<div class="d-flex flex-nowrap gap-1 align-items-center text-truncate">
|
|
32
32
|
<div class="d-sm-none">
|
|
33
33
|
<a class="d-inline-block position-relative text-decoration-none" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">
|
|
34
|
-
{buildAvatar(posts.user, "20px", true, "", "user/picture")}
|
|
34
|
+
{{buildAvatar(posts.user, "20px", true, "", "user/picture")}}
|
|
35
35
|
{{{ if ./user.isLocal }}}
|
|
36
36
|
<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>
|
|
37
37
|
{{{ else }}}
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
{{{ end }}}
|
|
58
58
|
|
|
59
59
|
<div class="d-flex gap-1 align-items-center">
|
|
60
|
-
<span class="text-muted">{generateWrote(@value, config.timeagoCutoff)}</span>
|
|
60
|
+
<span class="text-muted">{{generateWrote(@value, config.timeagoCutoff)}}</span>
|
|
61
61
|
|
|
62
62
|
<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>
|
|
63
63
|
<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>
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
<span>
|
|
69
69
|
|
|
70
70
|
{{{ each posts.user.custom_profile_info }}}
|
|
71
|
-
{posts.user.custom_profile_info.content}
|
|
71
|
+
{{posts.user.custom_profile_info.content}}
|
|
72
72
|
{{{ end }}}
|
|
73
73
|
</span>
|
|
74
74
|
</div>
|
|
@@ -81,12 +81,12 @@
|
|
|
81
81
|
</div>
|
|
82
82
|
|
|
83
83
|
<div class="content text-break" component="post/content" itemprop="text">
|
|
84
|
-
{posts.content}
|
|
84
|
+
{{posts.content}}
|
|
85
85
|
</div>
|
|
86
86
|
|
|
87
87
|
<div component="post/footer" class="post-footer border-bottom pb-2">
|
|
88
88
|
{{{ if posts.user.signature }}}
|
|
89
|
-
<div component="post/signature" data-uid="{posts.user.uid}" class="text-xs text-muted mt-2">{posts.user.signature}</div>
|
|
89
|
+
<div component="post/signature" data-uid="{posts.user.uid}" class="text-xs text-muted mt-2">{{posts.user.signature}}</div>
|
|
90
90
|
{{{ end }}}
|
|
91
91
|
|
|
92
92
|
<div class="d-flex flex-wrap-reverse gap-2 {{{ if (hideReplies || !posts.replies.count) }}}justify-content-end{{{ else }}}justify-content-between{{{ end }}}">
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
<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 }}}">
|
|
95
95
|
<span component="post/reply-count/avatars" class="d-flex gap-1 {{{ if posts.replies.hasMore }}}hasMore{{{ end }}}">
|
|
96
96
|
{{{each posts.replies.users}}}
|
|
97
|
-
<span>{buildAvatar(posts.replies.users, "20px", true, "avatar-tooltip")}</span>
|
|
97
|
+
<span>{{buildAvatar(posts.replies.users, "20px", true, "avatar-tooltip")}}</span>
|
|
98
98
|
{{{end}}}
|
|
99
99
|
{{{ if posts.replies.hasMore}}}
|
|
100
100
|
<span style="height: 20px; line-height: 20px;"><i class="fa fa-ellipsis"></i></span>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<div component="topic/quickreply/container" class="quick-reply d-flex gap-3 mb-4">
|
|
3
3
|
<div class="icon hidden-xs">
|
|
4
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")}
|
|
5
|
+
{{buildAvatar(loggedInUser, "48px", true, "", "user/picture")}}
|
|
6
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
7
|
</a>
|
|
8
8
|
</div>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<div class="dropdown bottom-sheet" component="thread/sort">
|
|
2
2
|
<button class="btn btn-ghost btn-sm ff-secondary d-flex gap-2 align-items-center dropdown-toggle text-truncate w-100" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="[[aria:post-sort-option, {sortOptionLabel}]]">
|
|
3
3
|
<i class="fa fa-fw fa-arrow-down-wide-short text-primary"></i>
|
|
4
|
-
<span class="d-none d-md-inline fw-semibold text-truncate text-nowrap">{sortOptionLabel}</span>
|
|
4
|
+
<span class="d-none d-md-inline fw-semibold text-truncate text-nowrap">{tx(sortOptionLabel)}</span>
|
|
5
5
|
</button>
|
|
6
6
|
|
|
7
7
|
<ul class="dropdown-menu dropdown-menu-end p-1 text-sm" role="menu">
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
{{{ each topics }}}
|
|
4
4
|
<li component="category/topic" class="category-item hover-parent border-bottom py-3 py-lg-4 d-flex flex-column flex-lg-row align-items-start {generateTopicClass(@value)}" <!-- IMPORT partials/data/category.tpl -->>
|
|
5
5
|
<link itemprop="url" content="{config.relative_path}/topic/{./slug}" />
|
|
6
|
-
<meta itemprop="name" content="{
|
|
6
|
+
<meta itemprop="name" content="{{generateTopicTitle(@value)}}" />
|
|
7
7
|
<meta itemprop="itemListOrder" content="descending" />
|
|
8
8
|
<meta itemprop="position" content="{increment(./index, "1")}" />
|
|
9
9
|
<a id="{./index}" data-index="{./index}" component="topic/anchor"></a>
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
<div class="d-flex p-0 col-12 col-lg-7 gap-2 gap-lg-3 pe-2 align-items-start {{{ if config.theme.mobileTopicTeasers }}}mb-2 mb-lg-0{{{ end }}}">
|
|
12
12
|
<div class="flex-shrink-0 position-relative">
|
|
13
13
|
<a class="d-inline-block text-decoration-none avatar-tooltip" title="{./user.displayname}" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">
|
|
14
|
-
{buildAvatar(./user, "40px", true)}
|
|
14
|
+
{{buildAvatar(./user, "40px", true)}}
|
|
15
15
|
</a>
|
|
16
16
|
{{{ if showSelect }}}
|
|
17
17
|
<div class="checkbox position-absolute top-100 start-50 translate-middle-x pt-2 m-0 d-none d-lg-flex" style="max-width:max-content">
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
</div>
|
|
22
22
|
<div class="flex-grow-1 d-flex flex-wrap gap-1 position-relative">
|
|
23
23
|
<h3 component="topic/header" class="title text-break text-wrap-pretty fs-5 fw-semibold m-0 tracking-tight w-100 {{{ if showSelect }}}me-4 me-lg-0{{{ end }}}">
|
|
24
|
-
<a class="text-reset" href="{{{ if topics.noAnchor }}}#{{{ else }}}{config.relative_path}/topic/{./slug}{{{ if ./bookmark }}}/{./bookmark}{{{ end }}}{{{ end }}}">{
|
|
24
|
+
<a class="text-reset" href="{{{ if topics.noAnchor }}}#{{{ else }}}{config.relative_path}/topic/{./slug}{{{ if ./bookmark }}}/{./bookmark}{{{ end }}}{{{ end }}}">{{generateTopicTitle(@value)}}</a>
|
|
25
25
|
</h3>
|
|
26
26
|
<span component="topic/labels" class="d-flex flex-wrap gap-1 w-100">
|
|
27
27
|
<span component="topic/watched" class="badge border border-gray-300 text-body {{{ if !./followed }}}hidden{{{ end }}}">
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
{{{each ./icons}}}<span class="lh-1">{@value}</span>{{{end}}}
|
|
52
52
|
|
|
53
53
|
{{{ if (!template.category || (cid != ./cid)) }}}
|
|
54
|
-
{buildCategoryLabel(./category, "a", "border")}
|
|
54
|
+
{{buildCategoryLabel(./category, "a", "border")}}
|
|
55
55
|
{{{ end }}}
|
|
56
56
|
|
|
57
57
|
<span data-tid="{./tid}" component="topic/tags" class="lh-1 tag-list d-flex flex-wrap gap-1 {{{ if !./tags.length }}}hidden{{{ end }}}">
|
|
@@ -114,12 +114,12 @@
|
|
|
114
114
|
{{{ else }}}
|
|
115
115
|
{{{ if ./teaser.pid }}}
|
|
116
116
|
<div class="ps-2">
|
|
117
|
-
<a href="{{{ if ./teaser.user.userslug }}}{config.relative_path}/user/{./teaser.user.userslug}{{{ else }}}#{{{ end }}}" class="text-decoration-none avatar-tooltip" title="{./teaser.user.displayname}">{buildAvatar(./teaser.user, "18px", true)}</a>
|
|
117
|
+
<a href="{{{ if ./teaser.user.userslug }}}{config.relative_path}/user/{./teaser.user.userslug}{{{ else }}}#{{{ end }}}" class="text-decoration-none avatar-tooltip" title="{./teaser.user.displayname}">{{buildAvatar(./teaser.user, "18px", true)}}</a>
|
|
118
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>
|
|
119
119
|
</div>
|
|
120
120
|
<div class="post-content text-xs ps-2 line-clamp-sm-2 lh-sm text-break position-relative flex-fill">
|
|
121
121
|
<a class="stretched-link" tabindex="-1" href="{config.relative_path}/topic/{./slug}/{./teaser.index}" aria-label="[[global:lastpost]]"></a>
|
|
122
|
-
{./teaser.content}
|
|
122
|
+
{{./teaser.content}}
|
|
123
123
|
</div>
|
|
124
124
|
{{{ end }}}
|
|
125
125
|
{{{ end }}}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<div>
|
|
2
2
|
<a href="{config.relative_path}/user/{./userslug}" class="btn btn-ghost gap-2 ff-base d-flex align-items-start justify-content-start p-2 text-start">
|
|
3
|
-
{buildAvatar(@value, "48px", true, "flex-shrink-0")}
|
|
3
|
+
{{buildAvatar(@value, "48px", true, "flex-shrink-0")}}
|
|
4
4
|
<div class="d-flex flex-column gap-1 text-truncate">
|
|
5
5
|
<div class="fw-semibold text-truncate" title="{./displayname}">{./displayname}</div>
|
|
6
6
|
<div class="text-xs text-muted text-truncate">@{./username}</div>
|
package/templates/topic.tpl
CHANGED
|
@@ -11,23 +11,7 @@
|
|
|
11
11
|
{{{ end }}}
|
|
12
12
|
|
|
13
13
|
<div class="flex-fill" itemid="{url}" itemscope itemtype="https://schema.org/DiscussionForumPosting">
|
|
14
|
-
|
|
15
|
-
<meta itemprop="text" content="{escape(titleRaw)}">
|
|
16
|
-
<meta itemprop="url" content="{url}">
|
|
17
|
-
<meta itemprop="datePublished" content="{timestampISO}">
|
|
18
|
-
<meta itemprop="dateModified" content="{lastposttimeISO}">
|
|
19
|
-
<div itemprop="author" itemscope itemtype="https://schema.org/Person">
|
|
20
|
-
<meta itemprop="name" content="{author.username}">
|
|
21
|
-
{{{ if author.userslug }}}<meta itemprop="url" content="{config.relative_path}/user/{author.userslug}">{{{ end }}}
|
|
22
|
-
</div>
|
|
23
|
-
<div itemprop="interactionStatistic" itemscope itemtype="https://schema.org/InteractionCounter">
|
|
24
|
-
<meta itemprop="interactionType" content="https://schema.org/CommentAction">
|
|
25
|
-
<meta itemprop="userInteractionCount" content="{increment(postcount, "-1")}">
|
|
26
|
-
</div>
|
|
27
|
-
<div itemprop="interactionStatistic" itemscope itemtype="https://schema.org/InteractionCounter">
|
|
28
|
-
<meta itemprop="interactionType" content="https://schema.org/LikeAction">
|
|
29
|
-
<meta itemprop="userInteractionCount" content="{upvotes}">
|
|
30
|
-
</div>
|
|
14
|
+
<!-- IMPORT partials/topic/meta-tags.tpl -->
|
|
31
15
|
|
|
32
16
|
<div class="d-flex flex-column gap-3">
|
|
33
17
|
<div class="d-flex gap-2 flex-wrap flex-column flex-md-row {{{ if config.theme.centerHeaderElements }}}justify-content-center{{{ else }}}justify-content-between{{{ end }}}">
|
|
@@ -52,7 +36,7 @@
|
|
|
52
36
|
</a>
|
|
53
37
|
{{{each icons}}}<span class="lh-1">{@value}</span>{{{end}}}
|
|
54
38
|
</span>
|
|
55
|
-
{buildCategoryLabel(category, "a", "border")}
|
|
39
|
+
{{buildCategoryLabel(category, "a", "border")}}
|
|
56
40
|
<div data-tid="{./tid}" component="topic/tags" class="lh-1 tags tag-list d-flex flex-wrap hidden-xs hidden-empty gap-2"><!-- IMPORT partials/topic/tags.tpl --></div>
|
|
57
41
|
<div class="d-flex gap-2" component="topic/stats"><!-- IMPORT partials/topic/stats.tpl --></div>
|
|
58
42
|
|
package/templates/world.tpl
CHANGED
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
|
|
14
14
|
<div class="category-header d-flex flex-column gap-2">
|
|
15
15
|
<div class="d-flex gap-2 align-items-center mb-1 {{{ if config.theme.centerHeaderElements }}}justify-content-center{{{ end }}}">
|
|
16
|
-
{buildCategoryIcon(@value, "40px", "rounded-1 flex-shrink-0")}
|
|
16
|
+
{{buildCategoryIcon(@value, "40px", "rounded-1 flex-shrink-0")}}
|
|
17
17
|
<h1 class="tracking-tight fs-2 fw-semibold mb-0 text-center">[[world:name]]</h1>
|
|
18
18
|
</div>
|
|
19
19
|
{{{ if ./descriptionParsed }}}
|
|
20
20
|
<p class="description text-secondary text-sm w-100 {{{ if config.theme.centerHeaderElements }}}text-center{{{ end }}}">
|
|
21
|
-
{./descriptionParsed}
|
|
21
|
+
{{./descriptionParsed}}
|
|
22
22
|
</p>
|
|
23
23
|
{{{ end }}}
|
|
24
24
|
</div>
|
|
@@ -39,14 +39,14 @@
|
|
|
39
39
|
{{{ each categories }}}
|
|
40
40
|
<li class="flex-grow-1 align-items-start d-flex gap-2 p-1 mb-2 position-relative">
|
|
41
41
|
<div>
|
|
42
|
-
{buildCategoryIcon(@value, "24px", "rounded-1")}
|
|
42
|
+
{{buildCategoryIcon(@value, "24px", "rounded-1")}}
|
|
43
43
|
</div>
|
|
44
44
|
<div class="d-grid gap-0">
|
|
45
45
|
<div class="title fw-semibold">
|
|
46
46
|
<a class="text-reset stretched-link" href="{{{ if ./link }}}{./link}{{{ else }}}{config.relative_path}/category/{./slug}{{{ end }}}" itemprop="url">{../name}</a>
|
|
47
47
|
</div>
|
|
48
48
|
{{{ if ./descriptionParsed }}}
|
|
49
|
-
<div class="description text-muted text-xs w-100 line-clamp-sm-5">{./descriptionParsed}</div>
|
|
49
|
+
<div class="description text-muted text-xs w-100 line-clamp-sm-5">{{./descriptionParsed}}</div>
|
|
50
50
|
{{{ end }}}
|
|
51
51
|
</div>
|
|
52
52
|
</li>
|