nodebb-theme-persona 13.3.31 → 13.3.33
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/.eslintrc +2 -2
- package/README.md +20 -20
- package/lib/controllers.js +24 -24
- package/library.js +97 -97
- package/package.json +52 -52
- package/plugin.json +20 -20
- package/public/.eslintrc +2 -2
- package/public/admin.js +15 -15
- package/public/modules/autohidingnavbar.js +220 -220
- package/public/modules/mobile-menu.js +190 -190
- package/public/modules/taskbar.js +65 -65
- package/public/persona.js +257 -257
- package/public/settings.js +53 -53
- package/scss/account.scss +336 -336
- package/scss/categories.scss +205 -205
- package/scss/category.scss +161 -161
- package/scss/chats.scss +14 -14
- package/scss/flags.scss +42 -42
- package/scss/footer.scss +16 -16
- package/scss/groups.scss +166 -166
- package/scss/header.scss +229 -361
- package/scss/keyframes.scss +152 -152
- package/scss/mixins.scss +129 -129
- package/scss/mobile.scss +222 -331
- package/scss/modules/composer.scss +20 -20
- package/scss/modules/cookie-consent.scss +12 -12
- package/scss/modules/fab.scss +32 -32
- package/scss/modules/morph.scss +268 -268
- package/scss/modules/necro-post.scss +8 -8
- package/scss/modules/nprogress.scss +80 -80
- package/scss/modules/taskbar.scss +160 -160
- package/scss/modules/user-menu.scss +7 -7
- package/scss/modules/usercard.scss +64 -64
- package/scss/noscript.scss +80 -80
- package/scss/overrides.scss +39 -39
- package/scss/persona.scss +34 -34
- package/scss/posts_list.scss +127 -127
- package/scss/search.scss +48 -48
- package/scss/style.scss +256 -270
- package/scss/tags.scss +10 -10
- package/scss/topic.scss +571 -571
- package/scss/topics_list.scss +16 -16
- package/scss/variables.scss +6 -6
- package/templates/account/blocks.tpl +46 -46
- package/templates/account/categories.tpl +28 -28
- package/templates/account/consent.tpl +68 -68
- package/templates/account/edit/password.tpl +29 -29
- package/templates/account/edit/username.tpl +25 -25
- package/templates/account/edit.tpl +136 -136
- package/templates/account/followers.tpl +17 -17
- package/templates/account/following.tpl +17 -17
- package/templates/account/groups.tpl +16 -16
- package/templates/account/info.tpl +291 -291
- package/templates/account/posts.tpl +18 -18
- package/templates/account/profile.tpl +166 -166
- package/templates/account/sessions.tpl +31 -31
- package/templates/account/settings.tpl +251 -251
- package/templates/account/tags.tpl +9 -9
- package/templates/account/theme.tpl +25 -25
- package/templates/account/topics.tpl +29 -29
- package/templates/account/uploads.tpl +42 -42
- package/templates/admin/plugins/persona.tpl +24 -24
- package/templates/categories.tpl +31 -31
- package/templates/category.tpl +63 -63
- package/templates/flags/detail.tpl +208 -208
- package/templates/flags/list.tpl +71 -71
- package/templates/footer.tpl +11 -11
- package/templates/groups/details.tpl +77 -77
- package/templates/groups/list.tpl +48 -48
- package/templates/groups/members.tpl +5 -5
- package/templates/header.tpl +47 -47
- package/templates/modules/taskbar.tpl +2 -2
- package/templates/modules/usercard.tpl +36 -36
- package/templates/notifications.tpl +66 -66
- package/templates/partials/account/category-item.tpl +23 -23
- package/templates/partials/account/header.tpl +47 -47
- package/templates/partials/account/menu.tpl +108 -108
- package/templates/partials/breadcrumbs.tpl +18 -18
- package/templates/partials/buttons/newTopic.tpl +22 -22
- package/templates/partials/categories/item.tpl +60 -60
- package/templates/partials/categories/lastpost.tpl +26 -26
- package/templates/partials/category/filter-dropdown-content.tpl +31 -31
- package/templates/partials/category/selector-dropdown-content.tpl +32 -32
- package/templates/partials/category/sort.tpl +14 -14
- package/templates/partials/category/subcategory.tpl +17 -17
- package/templates/partials/category/tags.tpl +3 -3
- package/templates/partials/category/tools.tpl +86 -86
- package/templates/partials/category/watch.tpl +55 -55
- package/templates/partials/chats-menu.tpl +41 -40
- package/templates/partials/cookie-consent.tpl +4 -4
- package/templates/partials/flags/filters.tpl +173 -173
- package/templates/partials/groups/admin.tpl +200 -200
- package/templates/partials/groups/filter-dropdown-content.tpl +24 -24
- package/templates/partials/groups/list.tpl +20 -20
- package/templates/partials/groups/memberlist.tpl +42 -42
- package/templates/partials/header/chats.tpl +18 -18
- package/templates/partials/header/notifications.tpl +49 -19
- package/templates/partials/header/search.tpl +24 -24
- package/templates/partials/header/user-menu.tpl +96 -96
- package/templates/partials/menu.tpl +128 -128
- package/templates/partials/notifications_list.tpl +44 -30
- package/templates/partials/paginator.tpl +44 -44
- package/templates/partials/post_bar.tpl +20 -20
- package/templates/partials/posts_list.tpl +7 -7
- package/templates/partials/posts_list_item.tpl +31 -31
- package/templates/partials/quick-search-results.tpl +33 -33
- package/templates/partials/search-filters.tpl +183 -183
- package/templates/partials/search-results.tpl +54 -54
- package/templates/partials/slideout-menu.tpl +4 -4
- package/templates/partials/tags/filter-dropdown-content.tpl +33 -33
- package/templates/partials/tags/watch.tpl +35 -35
- package/templates/partials/tags_list.tpl +4 -4
- package/templates/partials/toast.tpl +19 -19
- package/templates/partials/topic/event.tpl +12 -12
- package/templates/partials/topic/navigation-post.tpl +11 -11
- package/templates/partials/topic/navigator.tpl +39 -39
- package/templates/partials/topic/necro-post.tpl +2 -2
- package/templates/partials/topic/post-menu-list.tpl +132 -132
- package/templates/partials/topic/post-menu.tpl +4 -4
- package/templates/partials/topic/post.tpl +128 -128
- package/templates/partials/topic/quickreply.tpl +28 -28
- package/templates/partials/topic/reply-button.tpl +26 -26
- package/templates/partials/topic/selection-tooltip.tpl +2 -2
- package/templates/partials/topic/sort.tpl +9 -9
- package/templates/partials/topic/stats.tpl +11 -11
- package/templates/partials/topic/tags.tpl +2 -2
- package/templates/partials/topic/tools.tpl +7 -7
- package/templates/partials/topic/topic-menu-list.tpl +74 -74
- package/templates/partials/topic/watch.tpl +47 -47
- package/templates/partials/topic-filters.tpl +11 -11
- package/templates/partials/topic-terms.tpl +11 -11
- package/templates/partials/topics_list.tpl +117 -117
- package/templates/partials/users/filter-dropdown-content.tpl +20 -20
- package/templates/partials/users/item.tpl +43 -43
- package/templates/partials/users_list.tpl +14 -14
- package/templates/partials/users_list_menu.tpl +20 -20
- package/templates/popular.tpl +35 -35
- package/templates/recent.tpl +37 -37
- package/templates/search.tpl +47 -47
- package/templates/tag.tpl +34 -34
- package/templates/tags.tpl +32 -32
- package/templates/top.tpl +35 -35
- package/templates/topic.tpl +129 -129
- package/templates/unread.tpl +37 -37
- package/templates/users.tpl +34 -34
|
@@ -1,77 +1,77 @@
|
|
|
1
|
-
<div component="groups/container" class="groups details row">
|
|
2
|
-
<div component="groups/cover" style="background-image: url({group.cover:url}); background-position: {group.cover:position};">
|
|
3
|
-
<!-- IF group.isOwner -->
|
|
4
|
-
<div class="controls">
|
|
5
|
-
<span class="upload"><i class="fa fa-fw fa-4x fa-upload"></i></span>
|
|
6
|
-
<span class="resize"><i class="fa fa-fw fa-4x fa-arrows"></i></span>
|
|
7
|
-
<span class="remove"><i class="fa fa-fw fa-4x fa-times"></i></span>
|
|
8
|
-
</div>
|
|
9
|
-
<div class="save">[[groups:cover-save]] <i class="fa fa-fw fa-floppy-o"></i></div>
|
|
10
|
-
<div class="indicator">[[groups:cover-saving]] <i class="fa fa-fw fa-refresh fa-spin"></i></div>
|
|
11
|
-
<!-- ENDIF group.isOwner -->
|
|
12
|
-
</div>
|
|
13
|
-
|
|
14
|
-
<div class="col-12">
|
|
15
|
-
<!-- IMPORT partials/breadcrumbs.tpl -->
|
|
16
|
-
</div>
|
|
17
|
-
|
|
18
|
-
<div class="col-lg-4 col-12">
|
|
19
|
-
<div class="card mb-3">
|
|
20
|
-
<div class="card-header">
|
|
21
|
-
<span class="fs-5">
|
|
22
|
-
<i class="fa fa-list-ul"></i> [[groups:details.title]]
|
|
23
|
-
<!-- IF group.private --><span class="badge bg-info text-dark">[[groups:details.private]]</span><!-- ENDIF group.private -->
|
|
24
|
-
<!-- IF group.hidden --><span class="badge bg-info text-dark">[[groups:details.hidden]]</span> <!-- ENDIF group.hidden -->
|
|
25
|
-
</span>
|
|
26
|
-
</div>
|
|
27
|
-
<div class="card-body">
|
|
28
|
-
<h2>{group.displayName}</h2>
|
|
29
|
-
<p>{group.descriptionParsed}</p>
|
|
30
|
-
<!-- IF isAdmin -->
|
|
31
|
-
<div class="float-end">
|
|
32
|
-
<a href="{config.relative_path}/admin/manage/groups/{group.nameEncoded}" target="_blank" class="btn btn-info"><i class="fa fa-gear"></i> [[user:edit]]</a>
|
|
33
|
-
</div>
|
|
34
|
-
<!-- ENDIF isAdmin -->
|
|
35
|
-
<!-- IF loggedIn -->
|
|
36
|
-
<div class="float-end">
|
|
37
|
-
{function.membershipBtn, group}
|
|
38
|
-
</div>
|
|
39
|
-
<!-- ENDIF loggedIn -->
|
|
40
|
-
</div>
|
|
41
|
-
</div>
|
|
42
|
-
|
|
43
|
-
<div class="card mb-3">
|
|
44
|
-
<div class="card-header">
|
|
45
|
-
<span class="fs-5">
|
|
46
|
-
<i class="fa fa-users"></i> [[groups:details.members]]
|
|
47
|
-
</span>
|
|
48
|
-
</div>
|
|
49
|
-
<div class="card-body">
|
|
50
|
-
<!-- IMPORT partials/groups/memberlist.tpl -->
|
|
51
|
-
</div>
|
|
52
|
-
</div>
|
|
53
|
-
|
|
54
|
-
<!-- IF group.isOwner -->
|
|
55
|
-
<!-- IMPORT partials/groups/admin.tpl -->
|
|
56
|
-
<!-- ENDIF group.isOwner -->
|
|
57
|
-
|
|
58
|
-
<div data-widget-area="left">
|
|
59
|
-
{{{each widgets.left}}}
|
|
60
|
-
{{widgets.left.html}}
|
|
61
|
-
{{{end}}}
|
|
62
|
-
</div>
|
|
63
|
-
</div>
|
|
64
|
-
<div class="col-lg-8 col-12">
|
|
65
|
-
<div class="col-lg-11">
|
|
66
|
-
<!-- IF !posts.length -->
|
|
67
|
-
<div class="alert alert-info">[[groups:details.has-no-posts]]</div>
|
|
68
|
-
<!-- ENDIF !posts.length -->
|
|
69
|
-
<!-- IMPORT partials/posts_list.tpl -->
|
|
70
|
-
</div>
|
|
71
|
-
<div data-widget-area="right">
|
|
72
|
-
{{{each widgets.right}}}
|
|
73
|
-
{{widgets.right.html}}
|
|
74
|
-
{{{end}}}
|
|
75
|
-
</div>
|
|
76
|
-
</div>
|
|
77
|
-
</div>
|
|
1
|
+
<div component="groups/container" class="groups details row">
|
|
2
|
+
<div component="groups/cover" style="background-image: url({group.cover:url}); background-position: {group.cover:position};">
|
|
3
|
+
<!-- IF group.isOwner -->
|
|
4
|
+
<div class="controls">
|
|
5
|
+
<span class="upload"><i class="fa fa-fw fa-4x fa-upload"></i></span>
|
|
6
|
+
<span class="resize"><i class="fa fa-fw fa-4x fa-arrows"></i></span>
|
|
7
|
+
<span class="remove"><i class="fa fa-fw fa-4x fa-times"></i></span>
|
|
8
|
+
</div>
|
|
9
|
+
<div class="save">[[groups:cover-save]] <i class="fa fa-fw fa-floppy-o"></i></div>
|
|
10
|
+
<div class="indicator">[[groups:cover-saving]] <i class="fa fa-fw fa-refresh fa-spin"></i></div>
|
|
11
|
+
<!-- ENDIF group.isOwner -->
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
<div class="col-12">
|
|
15
|
+
<!-- IMPORT partials/breadcrumbs.tpl -->
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<div class="col-lg-4 col-12">
|
|
19
|
+
<div class="card mb-3">
|
|
20
|
+
<div class="card-header">
|
|
21
|
+
<span class="fs-5">
|
|
22
|
+
<i class="fa fa-list-ul"></i> [[groups:details.title]]
|
|
23
|
+
<!-- IF group.private --><span class="badge bg-info text-dark">[[groups:details.private]]</span><!-- ENDIF group.private -->
|
|
24
|
+
<!-- IF group.hidden --><span class="badge bg-info text-dark">[[groups:details.hidden]]</span> <!-- ENDIF group.hidden -->
|
|
25
|
+
</span>
|
|
26
|
+
</div>
|
|
27
|
+
<div class="card-body">
|
|
28
|
+
<h2>{group.displayName}</h2>
|
|
29
|
+
<p>{group.descriptionParsed}</p>
|
|
30
|
+
<!-- IF isAdmin -->
|
|
31
|
+
<div class="float-end">
|
|
32
|
+
<a href="{config.relative_path}/admin/manage/groups/{group.nameEncoded}" target="_blank" class="btn btn-info"><i class="fa fa-gear"></i> [[user:edit]]</a>
|
|
33
|
+
</div>
|
|
34
|
+
<!-- ENDIF isAdmin -->
|
|
35
|
+
<!-- IF loggedIn -->
|
|
36
|
+
<div class="float-end">
|
|
37
|
+
{function.membershipBtn, group}
|
|
38
|
+
</div>
|
|
39
|
+
<!-- ENDIF loggedIn -->
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
<div class="card mb-3">
|
|
44
|
+
<div class="card-header">
|
|
45
|
+
<span class="fs-5">
|
|
46
|
+
<i class="fa fa-users"></i> [[groups:details.members]]
|
|
47
|
+
</span>
|
|
48
|
+
</div>
|
|
49
|
+
<div class="card-body">
|
|
50
|
+
<!-- IMPORT partials/groups/memberlist.tpl -->
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<!-- IF group.isOwner -->
|
|
55
|
+
<!-- IMPORT partials/groups/admin.tpl -->
|
|
56
|
+
<!-- ENDIF group.isOwner -->
|
|
57
|
+
|
|
58
|
+
<div data-widget-area="left">
|
|
59
|
+
{{{each widgets.left}}}
|
|
60
|
+
{{widgets.left.html}}
|
|
61
|
+
{{{end}}}
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
<div class="col-lg-8 col-12">
|
|
65
|
+
<div class="col-lg-11">
|
|
66
|
+
<!-- IF !posts.length -->
|
|
67
|
+
<div class="alert alert-info">[[groups:details.has-no-posts]]</div>
|
|
68
|
+
<!-- ENDIF !posts.length -->
|
|
69
|
+
<!-- IMPORT partials/posts_list.tpl -->
|
|
70
|
+
</div>
|
|
71
|
+
<div data-widget-area="right">
|
|
72
|
+
{{{each widgets.right}}}
|
|
73
|
+
{{widgets.right.html}}
|
|
74
|
+
{{{end}}}
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
<!-- IMPORT partials/breadcrumbs.tpl -->
|
|
2
|
-
<div data-widget-area="header">
|
|
3
|
-
{{{each widgets.header}}}
|
|
4
|
-
{{widgets.header.html}}
|
|
5
|
-
{{{end}}}
|
|
6
|
-
</div>
|
|
7
|
-
<div class="groups list">
|
|
8
|
-
<div class="row justify-content-between">
|
|
9
|
-
<div class="col-lg-6">
|
|
10
|
-
<!-- IF allowGroupCreation -->
|
|
11
|
-
<button class="btn btn-primary" data-action="new"><i class="fa fa-plus"></i> [[groups:new-group]]</button>
|
|
12
|
-
<!-- ENDIF allowGroupCreation -->
|
|
13
|
-
</div>
|
|
14
|
-
<div class="col-lg-6">
|
|
15
|
-
<div class="row justify-content-end">
|
|
16
|
-
<div class="col-5 col-md-6">
|
|
17
|
-
<select class="form-select" id="search-sort">
|
|
18
|
-
<option value="alpha">[[groups:details.group-name]]</option>
|
|
19
|
-
<option value="count">[[groups:details.member-count]]</option>
|
|
20
|
-
<option value="date">[[groups:details.creation-date]]</option>
|
|
21
|
-
</select>
|
|
22
|
-
</div>
|
|
23
|
-
<div class="col-7 col-md-6">
|
|
24
|
-
<div class="input-group">
|
|
25
|
-
<input type="text" class="form-control" placeholder="[[global:search]]" name="query" value="" id="search-text">
|
|
26
|
-
<button id="search-button" class="btn btn-primary">
|
|
27
|
-
<i class="fa fa-search"></i>
|
|
28
|
-
</button>
|
|
29
|
-
</div>
|
|
30
|
-
</div>
|
|
31
|
-
</div>
|
|
32
|
-
</div>
|
|
33
|
-
</div>
|
|
34
|
-
|
|
35
|
-
<hr />
|
|
36
|
-
|
|
37
|
-
<div component="groups/container" class="row" id="groups-list" data-nextstart={nextStart}>
|
|
38
|
-
<!-- IF groups.length -->
|
|
39
|
-
<!-- IMPORT partials/groups/list.tpl -->
|
|
40
|
-
<!-- ELSE -->
|
|
41
|
-
<div class="col-12">
|
|
42
|
-
<div class="alert alert-warning">
|
|
43
|
-
[[groups:no-groups-found]]
|
|
44
|
-
</div>
|
|
45
|
-
</div>
|
|
46
|
-
<!-- ENDIF groups.length -->
|
|
47
|
-
</div>
|
|
48
|
-
</div>
|
|
1
|
+
<!-- IMPORT partials/breadcrumbs.tpl -->
|
|
2
|
+
<div data-widget-area="header">
|
|
3
|
+
{{{each widgets.header}}}
|
|
4
|
+
{{widgets.header.html}}
|
|
5
|
+
{{{end}}}
|
|
6
|
+
</div>
|
|
7
|
+
<div class="groups list">
|
|
8
|
+
<div class="row justify-content-between">
|
|
9
|
+
<div class="col-lg-6">
|
|
10
|
+
<!-- IF allowGroupCreation -->
|
|
11
|
+
<button class="btn btn-primary" data-action="new"><i class="fa fa-plus"></i> [[groups:new-group]]</button>
|
|
12
|
+
<!-- ENDIF allowGroupCreation -->
|
|
13
|
+
</div>
|
|
14
|
+
<div class="col-lg-6">
|
|
15
|
+
<div class="row justify-content-end">
|
|
16
|
+
<div class="col-5 col-md-6">
|
|
17
|
+
<select class="form-select" id="search-sort">
|
|
18
|
+
<option value="alpha">[[groups:details.group-name]]</option>
|
|
19
|
+
<option value="count">[[groups:details.member-count]]</option>
|
|
20
|
+
<option value="date">[[groups:details.creation-date]]</option>
|
|
21
|
+
</select>
|
|
22
|
+
</div>
|
|
23
|
+
<div class="col-7 col-md-6">
|
|
24
|
+
<div class="input-group">
|
|
25
|
+
<input type="text" class="form-control" placeholder="[[global:search]]" name="query" value="" id="search-text">
|
|
26
|
+
<button id="search-button" class="btn btn-primary">
|
|
27
|
+
<i class="fa fa-search"></i>
|
|
28
|
+
</button>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<hr />
|
|
36
|
+
|
|
37
|
+
<div component="groups/container" class="row" id="groups-list" data-nextstart={nextStart}>
|
|
38
|
+
<!-- IF groups.length -->
|
|
39
|
+
<!-- IMPORT partials/groups/list.tpl -->
|
|
40
|
+
<!-- ELSE -->
|
|
41
|
+
<div class="col-12">
|
|
42
|
+
<div class="alert alert-warning">
|
|
43
|
+
[[groups:no-groups-found]]
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
<!-- ENDIF groups.length -->
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
<!-- IMPORT partials/breadcrumbs.tpl -->
|
|
2
|
-
<div class="users">
|
|
3
|
-
<!-- IMPORT partials/users_list.tpl -->
|
|
4
|
-
|
|
5
|
-
<!-- IMPORT partials/paginator.tpl -->
|
|
1
|
+
<!-- IMPORT partials/breadcrumbs.tpl -->
|
|
2
|
+
<div class="users">
|
|
3
|
+
<!-- IMPORT partials/users_list.tpl -->
|
|
4
|
+
|
|
5
|
+
<!-- IMPORT partials/paginator.tpl -->
|
|
6
6
|
</div>
|
package/templates/header.tpl
CHANGED
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="{function.localeToHTML, userLang, defaultLang}" {{{if languageDirection}}}data-dir="{languageDirection}" style="direction: {languageDirection};"{{{end}}}>
|
|
3
|
-
<head>
|
|
4
|
-
<title>{browserTitle}</title>
|
|
5
|
-
{{{each metaTags}}}{function.buildMetaTag}{{{end}}}
|
|
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}}}{function.buildLinkTag}{{{end}}}
|
|
8
|
-
|
|
9
|
-
<script>
|
|
10
|
-
var config = JSON.parse('{{configJSON}}');
|
|
11
|
-
var app = {
|
|
12
|
-
user: JSON.parse('{{userJSON}}')
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
document.documentElement.style.setProperty('--panel-offset', `${localStorage.getItem('panelOffset') || 0}px`);
|
|
16
|
-
</script>
|
|
17
|
-
|
|
18
|
-
{{{if useCustomHTML}}}
|
|
19
|
-
{{customHTML}}
|
|
20
|
-
{{{end}}}
|
|
21
|
-
{{{if useCustomCSS}}}
|
|
22
|
-
<style>{{customCSS}}</style>
|
|
23
|
-
{{{end}}}
|
|
24
|
-
</head>
|
|
25
|
-
|
|
26
|
-
<body class="{bodyClass} skin-{{{if bootswatchSkin}}}{bootswatchSkin}{{{else}}}noskin{{{end}}}">
|
|
27
|
-
<nav id="menu" class="slideout-menu hidden">
|
|
28
|
-
<!-- IMPORT partials/slideout-menu.tpl -->
|
|
29
|
-
</nav>
|
|
30
|
-
<nav id="chats-menu" class="slideout-menu hidden">
|
|
31
|
-
<!-- IMPORT partials/chats-menu.tpl -->
|
|
32
|
-
</nav>
|
|
33
|
-
|
|
34
|
-
<main id="panel" class="slideout-panel">
|
|
35
|
-
<nav class="navbar sticky-top navbar-expand-lg bg-light header border-bottom py-0" id="header-menu" component="navbar">
|
|
36
|
-
<div class="container justify-content-start flex-nowrap">
|
|
37
|
-
<!-- IMPORT partials/menu.tpl -->
|
|
38
|
-
</div>
|
|
39
|
-
</nav>
|
|
40
|
-
<script>
|
|
41
|
-
const rect = document.getElementById('header-menu').getBoundingClientRect();
|
|
42
|
-
const offset = Math.max(0, rect.bottom);
|
|
43
|
-
document.documentElement.style.setProperty('--panel-offset', offset + `px`);
|
|
44
|
-
</script>
|
|
45
|
-
<div class="container pt-3" id="content">
|
|
46
|
-
<!-- IMPORT partials/noscript/warning.tpl -->
|
|
47
|
-
<!-- IMPORT partials/noscript/message.tpl -->
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="{function.localeToHTML, userLang, defaultLang}" {{{if languageDirection}}}data-dir="{languageDirection}" style="direction: {languageDirection};"{{{end}}}>
|
|
3
|
+
<head>
|
|
4
|
+
<title>{browserTitle}</title>
|
|
5
|
+
{{{each metaTags}}}{function.buildMetaTag}{{{end}}}
|
|
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}}}{function.buildLinkTag}{{{end}}}
|
|
8
|
+
|
|
9
|
+
<script>
|
|
10
|
+
var config = JSON.parse('{{configJSON}}');
|
|
11
|
+
var app = {
|
|
12
|
+
user: JSON.parse('{{userJSON}}')
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
document.documentElement.style.setProperty('--panel-offset', `${localStorage.getItem('panelOffset') || 0}px`);
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
{{{if useCustomHTML}}}
|
|
19
|
+
{{customHTML}}
|
|
20
|
+
{{{end}}}
|
|
21
|
+
{{{if useCustomCSS}}}
|
|
22
|
+
<style>{{customCSS}}</style>
|
|
23
|
+
{{{end}}}
|
|
24
|
+
</head>
|
|
25
|
+
|
|
26
|
+
<body class="{bodyClass} skin-{{{if bootswatchSkin}}}{bootswatchSkin}{{{else}}}noskin{{{end}}}">
|
|
27
|
+
<nav id="menu" class="slideout-menu hidden">
|
|
28
|
+
<!-- IMPORT partials/slideout-menu.tpl -->
|
|
29
|
+
</nav>
|
|
30
|
+
<nav id="chats-menu" class="slideout-menu hidden">
|
|
31
|
+
<!-- IMPORT partials/chats-menu.tpl -->
|
|
32
|
+
</nav>
|
|
33
|
+
|
|
34
|
+
<main id="panel" class="slideout-panel">
|
|
35
|
+
<nav class="navbar sticky-top navbar-expand-lg bg-light header border-bottom py-0" id="header-menu" component="navbar">
|
|
36
|
+
<div class="container justify-content-start flex-nowrap">
|
|
37
|
+
<!-- IMPORT partials/menu.tpl -->
|
|
38
|
+
</div>
|
|
39
|
+
</nav>
|
|
40
|
+
<script>
|
|
41
|
+
const rect = document.getElementById('header-menu').getBoundingClientRect();
|
|
42
|
+
const offset = Math.max(0, rect.bottom);
|
|
43
|
+
document.documentElement.style.setProperty('--panel-offset', offset + `px`);
|
|
44
|
+
</script>
|
|
45
|
+
<div class="container pt-3" id="content">
|
|
46
|
+
<!-- IMPORT partials/noscript/warning.tpl -->
|
|
47
|
+
<!-- IMPORT partials/noscript/message.tpl -->
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
<div id="taskbar" component="taskbar" class="taskbar fixed-bottom">
|
|
2
|
-
<div class="navbar-inner"><ul class="nav navbar-nav"></ul></div>
|
|
1
|
+
<div id="taskbar" component="taskbar" class="taskbar fixed-bottom">
|
|
2
|
+
<div class="navbar-inner"><ul class="nav navbar-nav"></ul></div>
|
|
3
3
|
</div>
|
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
<div class="persona-usercard">
|
|
2
|
-
<a href="{config.relative_path}/user/{userslug}">
|
|
3
|
-
<!-- IF picture -->
|
|
4
|
-
<div class="usercard-picture" style="background-image:url({picture})"></div>
|
|
5
|
-
<!-- ELSE -->
|
|
6
|
-
<div class="usercard-picture" style="background-color: {icon:bgColor};">{icon:text}</div>
|
|
7
|
-
<!-- ENDIF picture -->
|
|
8
|
-
</a>
|
|
9
|
-
<div class="usercard-body">
|
|
10
|
-
<a href="{config.relative_path}/user/{userslug}">
|
|
11
|
-
<span class="usercard-name"><!-- IF fullname -->{fullname}<!-- ELSE -->{username}<!-- ENDIF fullname --></span><br />
|
|
12
|
-
<span class="usercard-username"><!-- IF !banned -->@{username}<!-- ELSE -->[[user:banned]]<!-- ENDIF !banned --></span>
|
|
13
|
-
<!-- IF !banned -->
|
|
14
|
-
<i component="user/status" class="fa fa-circle status {status}" title="[[global:{status}]]"></i>
|
|
15
|
-
<!-- ENDIF !banned -->
|
|
16
|
-
</a>
|
|
17
|
-
|
|
18
|
-
<div class="row usercard-info">
|
|
19
|
-
<div class="col-4">
|
|
20
|
-
<small>[[global:posts]]</small>
|
|
21
|
-
<span>{humanReadableNumber(postcount)}</span>
|
|
22
|
-
</div>
|
|
23
|
-
<div class="col-4">
|
|
24
|
-
<small>[[global:reputation]]</small>
|
|
25
|
-
<span>{humanReadableNumber(reputation)}</span>
|
|
26
|
-
</div>
|
|
27
|
-
|
|
28
|
-
<button class="btn-morph persona-fab <!-- IF banned --> hide<!-- ENDIF banned -->">
|
|
29
|
-
<span>
|
|
30
|
-
<span class="s1"></span>
|
|
31
|
-
<span class="s2"></span>
|
|
32
|
-
<span class="s3"></span>
|
|
33
|
-
</span>
|
|
34
|
-
</button>
|
|
35
|
-
</div>
|
|
36
|
-
</div>
|
|
1
|
+
<div class="persona-usercard">
|
|
2
|
+
<a href="{config.relative_path}/user/{userslug}">
|
|
3
|
+
<!-- IF picture -->
|
|
4
|
+
<div class="usercard-picture" style="background-image:url({picture})"></div>
|
|
5
|
+
<!-- ELSE -->
|
|
6
|
+
<div class="usercard-picture" style="background-color: {icon:bgColor};">{icon:text}</div>
|
|
7
|
+
<!-- ENDIF picture -->
|
|
8
|
+
</a>
|
|
9
|
+
<div class="usercard-body">
|
|
10
|
+
<a href="{config.relative_path}/user/{userslug}">
|
|
11
|
+
<span class="usercard-name"><!-- IF fullname -->{fullname}<!-- ELSE -->{username}<!-- ENDIF fullname --></span><br />
|
|
12
|
+
<span class="usercard-username"><!-- IF !banned -->@{username}<!-- ELSE -->[[user:banned]]<!-- ENDIF !banned --></span>
|
|
13
|
+
<!-- IF !banned -->
|
|
14
|
+
<i component="user/status" class="fa fa-circle status {status}" title="[[global:{status}]]"></i>
|
|
15
|
+
<!-- ENDIF !banned -->
|
|
16
|
+
</a>
|
|
17
|
+
|
|
18
|
+
<div class="row usercard-info">
|
|
19
|
+
<div class="col-4">
|
|
20
|
+
<small>[[global:posts]]</small>
|
|
21
|
+
<span>{humanReadableNumber(postcount)}</span>
|
|
22
|
+
</div>
|
|
23
|
+
<div class="col-4">
|
|
24
|
+
<small>[[global:reputation]]</small>
|
|
25
|
+
<span>{humanReadableNumber(reputation)}</span>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<button class="btn-morph persona-fab <!-- IF banned --> hide<!-- ENDIF banned -->">
|
|
29
|
+
<span>
|
|
30
|
+
<span class="s1"></span>
|
|
31
|
+
<span class="s2"></span>
|
|
32
|
+
<span class="s3"></span>
|
|
33
|
+
</span>
|
|
34
|
+
</button>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
37
|
</div>
|
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
|
|
2
|
-
<div class="notifications">
|
|
3
|
-
|
|
4
|
-
<!-- IMPORT partials/breadcrumbs.tpl -->
|
|
5
|
-
<div class="btn-toolbar justify-content-end" role="toolbar">
|
|
6
|
-
<div class="btn-group me-2">
|
|
7
|
-
<button class="btn btn-outline-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
8
|
-
{{{ if selectedFilter }}}{selectedFilter.name}{{{ end}}} <span class="caret"></span>
|
|
9
|
-
</button>
|
|
10
|
-
<ul class="dropdown-menu dropdown-menu-end" role="menu">
|
|
11
|
-
{{{ each filters }}}
|
|
12
|
-
{{{ if filters.separator }}}
|
|
13
|
-
<li role="separator" class="dropdown-divider"></li>
|
|
14
|
-
{{{ else }}}
|
|
15
|
-
<li role="presentation" class="category">
|
|
16
|
-
<a class="dropdown-item" role="menuitem" href="{config.relative_path}/notifications?filter={filters.filter}"><i class="fa fa-fw {{{ if filters.selected }}}fa-check{{{ end }}}"></i> {filters.name}</a>
|
|
17
|
-
</li>
|
|
18
|
-
{{{ end }}}
|
|
19
|
-
{{{ end }}}
|
|
20
|
-
</ul>
|
|
21
|
-
</div>
|
|
22
|
-
|
|
23
|
-
<div class="btn-group">
|
|
24
|
-
<button class="btn btn-outline-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
25
|
-
<i class="fa fa-eye"></i>
|
|
26
|
-
<span class="caret"></span>
|
|
27
|
-
</button>
|
|
28
|
-
<ul class="dropdown-menu dropdown-menu-end" role="menu" aria-labelledby="dropdownMenu1">
|
|
29
|
-
<li role="presentation"><a class="dropdown-item" role="menuitem" href="#" component="notifications/mark_all">[[notifications:mark-all-read]]</a></li>
|
|
30
|
-
</ul>
|
|
31
|
-
</div>
|
|
32
|
-
</div>
|
|
33
|
-
|
|
34
|
-
<hr />
|
|
35
|
-
|
|
36
|
-
<div class="alert alert-info {{{ if notifications.length }}}hidden{{{ end }}}">
|
|
37
|
-
[[notifications:no-notifs]]
|
|
38
|
-
</div>
|
|
39
|
-
|
|
40
|
-
<ul class="notifications-list list-unstyled" data-nextstart="{nextStart}">
|
|
41
|
-
{{{each notifications}}}
|
|
42
|
-
<li data-nid="{notifications.nid}" class="{notifications.readClass} {{{ if !./read}}}text-bg-warning{{{ end }}} d-flex pointer border p-3 mb-2" component="notifications/item">
|
|
43
|
-
<div class="me-2">
|
|
44
|
-
{{{ if notifications.from }}}
|
|
45
|
-
{buildAvatar(notifications.user, "24px", true)}
|
|
46
|
-
{{{ else }}}
|
|
47
|
-
{{{ if notifications.image }}}
|
|
48
|
-
<img width="24" height="24" src="{notifications.image}" />
|
|
49
|
-
{{{ end }}}
|
|
50
|
-
{{{ end }}}
|
|
51
|
-
</div>
|
|
52
|
-
<div>
|
|
53
|
-
<p class="mb-1">
|
|
54
|
-
<a class="text-reset" component="notifications/item/link" href="{notifications.path}">{notifications.bodyShort}</a>
|
|
55
|
-
</p>
|
|
56
|
-
<p class="timestamp">
|
|
57
|
-
<span class="timeago small text-reset" title="{notifications.datetimeISO}"></span>
|
|
58
|
-
</p>
|
|
59
|
-
</div>
|
|
60
|
-
</li>
|
|
61
|
-
{{{end}}}
|
|
62
|
-
</ul>
|
|
63
|
-
<!-- IMPORT partials/paginator.tpl -->
|
|
64
|
-
</div>
|
|
65
|
-
|
|
66
|
-
|
|
1
|
+
|
|
2
|
+
<div class="notifications">
|
|
3
|
+
|
|
4
|
+
<!-- IMPORT partials/breadcrumbs.tpl -->
|
|
5
|
+
<div class="btn-toolbar justify-content-end" role="toolbar">
|
|
6
|
+
<div class="btn-group me-2">
|
|
7
|
+
<button class="btn btn-outline-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
8
|
+
{{{ if selectedFilter }}}{selectedFilter.name}{{{ end}}} <span class="caret"></span>
|
|
9
|
+
</button>
|
|
10
|
+
<ul class="dropdown-menu dropdown-menu-end" role="menu">
|
|
11
|
+
{{{ each filters }}}
|
|
12
|
+
{{{ if filters.separator }}}
|
|
13
|
+
<li role="separator" class="dropdown-divider"></li>
|
|
14
|
+
{{{ else }}}
|
|
15
|
+
<li role="presentation" class="category">
|
|
16
|
+
<a class="dropdown-item" role="menuitem" href="{config.relative_path}/notifications?filter={filters.filter}"><i class="fa fa-fw {{{ if filters.selected }}}fa-check{{{ end }}}"></i> {filters.name}</a>
|
|
17
|
+
</li>
|
|
18
|
+
{{{ end }}}
|
|
19
|
+
{{{ end }}}
|
|
20
|
+
</ul>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<div class="btn-group">
|
|
24
|
+
<button class="btn btn-outline-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
25
|
+
<i class="fa fa-eye"></i>
|
|
26
|
+
<span class="caret"></span>
|
|
27
|
+
</button>
|
|
28
|
+
<ul class="dropdown-menu dropdown-menu-end" role="menu" aria-labelledby="dropdownMenu1">
|
|
29
|
+
<li role="presentation"><a class="dropdown-item" role="menuitem" href="#" component="notifications/mark_all">[[notifications:mark-all-read]]</a></li>
|
|
30
|
+
</ul>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
|
|
34
|
+
<hr />
|
|
35
|
+
|
|
36
|
+
<div class="alert alert-info {{{ if notifications.length }}}hidden{{{ end }}}">
|
|
37
|
+
[[notifications:no-notifs]]
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<ul class="notifications-list list-unstyled" data-nextstart="{nextStart}">
|
|
41
|
+
{{{each notifications}}}
|
|
42
|
+
<li data-nid="{notifications.nid}" class="{notifications.readClass} {{{ if !./read}}}text-bg-warning{{{ end }}} d-flex pointer border p-3 mb-2" component="notifications/item">
|
|
43
|
+
<div class="me-2">
|
|
44
|
+
{{{ if notifications.from }}}
|
|
45
|
+
{buildAvatar(notifications.user, "24px", true)}
|
|
46
|
+
{{{ else }}}
|
|
47
|
+
{{{ if notifications.image }}}
|
|
48
|
+
<img width="24" height="24" src="{notifications.image}" />
|
|
49
|
+
{{{ end }}}
|
|
50
|
+
{{{ end }}}
|
|
51
|
+
</div>
|
|
52
|
+
<div>
|
|
53
|
+
<p class="mb-1">
|
|
54
|
+
<a class="text-reset" component="notifications/item/link" href="{notifications.path}">{notifications.bodyShort}</a>
|
|
55
|
+
</p>
|
|
56
|
+
<p class="timestamp">
|
|
57
|
+
<span class="timeago small text-reset" title="{notifications.datetimeISO}"></span>
|
|
58
|
+
</p>
|
|
59
|
+
</div>
|
|
60
|
+
</li>
|
|
61
|
+
{{{end}}}
|
|
62
|
+
</ul>
|
|
63
|
+
<!-- IMPORT partials/paginator.tpl -->
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
<li component="categories/category" data-cid="{../cid}" data-parent-cid="{../parentCid}" class="row clearfix">
|
|
2
|
-
<meta itemprop="name" content="{../name}">
|
|
3
|
-
|
|
4
|
-
<div class="content col-10 depth-{../depth}">
|
|
5
|
-
<div class="float-start">
|
|
6
|
-
{buildCategoryIcon(@value, "48px", "rounded-circle")}
|
|
7
|
-
</div>
|
|
8
|
-
|
|
9
|
-
<h2 class="title">
|
|
10
|
-
<!-- IMPORT partials/categories/link.tpl -->
|
|
11
|
-
</h2>
|
|
12
|
-
<div>
|
|
13
|
-
<!-- IF ../descriptionParsed -->
|
|
14
|
-
<div class="description text-muted">
|
|
15
|
-
{../descriptionParsed}
|
|
16
|
-
</div>
|
|
17
|
-
<!-- ENDIF ../descriptionParsed -->
|
|
18
|
-
</div>
|
|
19
|
-
</div>
|
|
20
|
-
<div class="col-2">
|
|
21
|
-
<!-- IMPORT partials/category/watch.tpl -->
|
|
22
|
-
</div>
|
|
23
|
-
</li>
|
|
1
|
+
<li component="categories/category" data-cid="{../cid}" data-parent-cid="{../parentCid}" class="row clearfix">
|
|
2
|
+
<meta itemprop="name" content="{../name}">
|
|
3
|
+
|
|
4
|
+
<div class="content col-10 depth-{../depth}">
|
|
5
|
+
<div class="float-start">
|
|
6
|
+
{buildCategoryIcon(@value, "48px", "rounded-circle")}
|
|
7
|
+
</div>
|
|
8
|
+
|
|
9
|
+
<h2 class="title">
|
|
10
|
+
<!-- IMPORT partials/categories/link.tpl -->
|
|
11
|
+
</h2>
|
|
12
|
+
<div>
|
|
13
|
+
<!-- IF ../descriptionParsed -->
|
|
14
|
+
<div class="description text-muted">
|
|
15
|
+
{../descriptionParsed}
|
|
16
|
+
</div>
|
|
17
|
+
<!-- ENDIF ../descriptionParsed -->
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="col-2">
|
|
21
|
+
<!-- IMPORT partials/category/watch.tpl -->
|
|
22
|
+
</div>
|
|
23
|
+
</li>
|