nodebb-theme-harmony 0.0.1 → 0.0.2
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/languages/en-GB/harmony.json +5 -0
- package/library.js +101 -26
- package/package.json +5 -2
- package/plugin.json +14 -2
- package/public/harmony.js +101 -0
- package/scss/account.scss +38 -0
- package/scss/chats.scss +72 -0
- package/scss/common.scss +65 -0
- package/scss/fonts.scss +17 -0
- package/scss/groups.scss +30 -0
- package/scss/harmony.scss +23 -3
- package/scss/header.scss +16 -0
- package/scss/mixins.scss +183 -0
- package/scss/modals.scss +4 -0
- package/scss/modules/bottom-sheet.scss +52 -0
- package/scss/modules/breadcrumbs.scss +16 -0
- package/scss/modules/composer.scss +21 -0
- package/scss/modules/cover.scss +115 -0
- package/scss/modules/tags.scss +6 -0
- package/scss/modules/topic-navigator.scss +61 -0
- package/scss/modules/topics-list.scss +20 -0
- package/scss/modules/user-menu.scss +5 -0
- package/scss/overrides.scss +65 -0
- package/scss/sidebar.scss +125 -0
- package/scss/skins.scss +13 -0
- package/scss/status.scss +25 -0
- package/scss/topic.scss +128 -0
- package/templates/account/best.tpl +0 -2
- package/templates/account/blocks.tpl +31 -26
- package/templates/account/bookmarks.tpl +0 -2
- package/templates/account/categories.tpl +1 -3
- package/templates/account/controversial.tpl +0 -2
- package/templates/account/downvoted.tpl +0 -2
- package/templates/account/followers.tpl +14 -10
- package/templates/account/following.tpl +14 -10
- package/templates/account/groups.tpl +13 -11
- package/templates/account/ignored.tpl +0 -2
- package/templates/account/posts.tpl +29 -10
- package/templates/account/profile.tpl +76 -159
- package/templates/account/topics.tpl +32 -21
- package/templates/account/uploads.tpl +38 -35
- package/templates/account/upvoted.tpl +0 -2
- package/templates/account/watched.tpl +0 -2
- package/templates/admin/plugins/harmony.tpl +17 -0
- package/templates/categories.tpl +5 -5
- package/templates/category.tpl +26 -26
- package/templates/chat.tpl +9 -9
- package/templates/chats.tpl +5 -7
- package/templates/footer.tpl +11 -7
- package/templates/groups/details.tpl +76 -62
- package/templates/groups/list.tpl +16 -11
- package/templates/header.tpl +34 -21
- package/templates/login.tpl +51 -45
- package/templates/partials/account/admin-menu.tpl +36 -0
- package/templates/partials/account/category-item.tpl +17 -17
- package/templates/partials/account/header.tpl +77 -35
- package/templates/partials/account/sidebar-left.tpl +82 -0
- package/templates/partials/breadcrumbs.tpl +4 -12
- package/templates/partials/categories/item.tpl +48 -44
- package/templates/partials/categories/lastpost.tpl +17 -19
- package/templates/partials/categories/link.tpl +5 -13
- package/templates/partials/category/sort.tpl +4 -7
- package/templates/partials/category/subcategory.tpl +4 -4
- package/templates/partials/category/tools.tpl +6 -9
- package/templates/partials/category/watch.tpl +7 -11
- package/templates/partials/category-filter-content.tpl +5 -6
- package/templates/partials/category-filter.tpl +0 -2
- package/templates/partials/category-selector-content.tpl +4 -5
- package/templates/partials/category-selector.tpl +0 -2
- package/templates/partials/chats/dropdown.tpl +24 -32
- package/templates/partials/chats/message-window.tpl +7 -7
- package/templates/partials/chats/message.tpl +34 -34
- package/templates/partials/chats/recent_room.tpl +16 -29
- package/templates/partials/chats/system-message.tpl +4 -4
- package/templates/partials/chats/user.tpl +1 -3
- package/templates/partials/groups/admin.tpl +82 -175
- package/templates/partials/groups/badge.tpl +1 -3
- package/templates/partials/groups/invited.tpl +31 -0
- package/templates/partials/groups/list.tpl +14 -21
- package/templates/partials/groups/memberlist.tpl +28 -24
- package/templates/partials/groups/pending.tpl +28 -0
- package/templates/partials/groups/sidebar-left.tpl +27 -0
- package/templates/partials/mobile-footer.tpl +70 -0
- package/templates/partials/notifications_list.tpl +19 -27
- package/templates/partials/paginator.tpl +22 -24
- package/templates/partials/post_bar.tpl +23 -18
- package/templates/partials/posts_list.tpl +0 -2
- package/templates/partials/posts_list_item.tpl +14 -29
- package/templates/partials/quick-search-results.tpl +36 -25
- package/templates/partials/search-results.tpl +4 -1
- package/templates/partials/sidebar/chats.tpl +53 -0
- package/templates/partials/sidebar/drafts.tpl +41 -0
- package/templates/partials/sidebar/logged-out-menu.tpl +38 -0
- package/templates/partials/sidebar/notifications.tpl +28 -0
- package/templates/partials/sidebar/search-mobile.tpl +29 -0
- package/templates/partials/sidebar/search.tpl +30 -0
- package/templates/partials/sidebar/user-menu.tpl +87 -0
- package/templates/partials/sidebar-left.tpl +40 -0
- package/templates/partials/sidebar-right.tpl +41 -0
- package/templates/partials/skin-switcher.tpl +35 -0
- package/templates/partials/tags_list.tpl +0 -2
- package/templates/partials/toast.tpl +6 -8
- package/templates/partials/topic/event.tpl +4 -20
- package/templates/partials/topic/navigator.tpl +20 -41
- package/templates/partials/topic/necro-post.tpl +5 -4
- package/templates/partials/topic/post-menu.tpl +23 -2
- package/templates/partials/topic/post-placeholder.tpl +15 -0
- package/templates/partials/topic/post.tpl +67 -64
- package/templates/partials/topic/quickreply.tpl +12 -14
- package/templates/partials/topic/reactions.tpl +0 -2
- package/templates/partials/topic/reply-button.tpl +16 -20
- package/templates/partials/topic/selection-tooltip.tpl +0 -2
- package/templates/partials/topic/sort.tpl +8 -6
- package/templates/partials/topic/stats.tpl +15 -14
- package/templates/partials/topic/tag.tpl +1 -3
- package/templates/partials/topic/tags.tpl +1 -5
- package/templates/partials/topic/tools.tpl +13 -0
- package/templates/partials/topic/watch.tpl +15 -13
- package/templates/partials/topic-filters.tpl +4 -5
- package/templates/partials/topic-list-bar.tpl +54 -0
- package/templates/partials/topic-terms.tpl +4 -5
- package/templates/partials/topics_list.tpl +109 -100
- package/templates/partials/users/item.tpl +7 -0
- package/templates/partials/users_list.tpl +11 -60
- package/templates/partials/users_list_menu.tpl +10 -18
- package/templates/popular.tpl +1 -18
- package/templates/recent.tpl +8 -24
- package/templates/register.tpl +74 -60
- package/templates/tag.tpl +3 -15
- package/templates/tags.tpl +3 -4
- package/templates/top.tpl +1 -18
- package/templates/topic.tpl +39 -43
- package/templates/unread.tpl +1 -22
- package/templates/users.tpl +17 -17
- package/templates/admin/plugins/persona.tpl +0 -29
- package/templates/partials/account/menu.tpl +0 -103
- package/templates/partials/header/user-menu.tpl +0 -87
- package/templates/partials/menu.tpl +0 -188
- package/templates/partials/thread_tools.tpl +0 -10
|
@@ -1,79 +1,93 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
<div
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
<div component="groups/container" class="groups details">
|
|
2
|
+
<div class="cover position-absolute start-0 top-0" component="groups/cover" style="background-image: url({group.cover:url}); background-position: {group.cover:position};">
|
|
3
|
+
<div class="container">
|
|
4
|
+
{{{ if group.isOwner }}}
|
|
5
|
+
<div class="controls">
|
|
6
|
+
<span class="upload"><i class="fa fa-fw fa-2x fa-upload"></i></span>
|
|
7
|
+
<span class="resize"><i class="fa fa-fw fa-2x fa-arrows"></i></span>
|
|
8
|
+
<span class="remove"><i class="fa fa-fw fa-2x fa-times"></i></span>
|
|
9
|
+
</div>
|
|
10
|
+
<div class="save text-bg-primary">[[groups:cover-save]] <i class="fa fa-fw fa-floppy-o"></i></div>
|
|
11
|
+
<div class="indicator text-bg-primary">[[groups:cover-saving]] <i class="fa fa-fw fa-refresh fa-spin"></i></div>
|
|
12
|
+
{{{ end }}}
|
|
10
13
|
</div>
|
|
11
|
-
<div class="save">[[groups:cover-save]] <i class="fa fa-fw fa-floppy-o"></i></div>
|
|
12
|
-
<div class="indicator">[[groups:cover-saving]] <i class="fa fa-fw fa-refresh fa-spin"></i></div>
|
|
13
|
-
<!-- ENDIF group.isOwner -->
|
|
14
14
|
</div>
|
|
15
15
|
|
|
16
|
-
<div class="
|
|
16
|
+
<div class="my-2">
|
|
17
17
|
<!-- IMPORT partials/breadcrumbs.tpl -->
|
|
18
18
|
</div>
|
|
19
19
|
|
|
20
|
-
<div class="
|
|
21
|
-
<div class="
|
|
22
|
-
<div class="
|
|
23
|
-
<
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
<!-- IF group.hidden --><span class="badge bg-info text-dark">[[groups:details.hidden]]</span> <!-- ENDIF group.hidden -->
|
|
27
|
-
</span>
|
|
20
|
+
<div class="d-flex flex-column mb-2">
|
|
21
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
22
|
+
<div class="d-flex align-items-center gap-2">
|
|
23
|
+
<h2 class="mb-0">{group.displayName}</h2>
|
|
24
|
+
{{{ if group.private }}}<span class="badge text-bg-info">[[groups:details.private]]</span>{{{ end }}}
|
|
25
|
+
{{{ if group.hidden }}}<span class="badge text-bg-info">[[groups:details.hidden]]</span>{{{ end }}}
|
|
28
26
|
</div>
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
</
|
|
36
|
-
|
|
37
|
-
<!-- IF loggedIn -->
|
|
38
|
-
<div class="float-end">
|
|
39
|
-
{function.membershipBtn, group}
|
|
40
|
-
</div>
|
|
41
|
-
<!-- ENDIF loggedIn -->
|
|
27
|
+
|
|
28
|
+
<div>
|
|
29
|
+
{{{ if loggedIn }}}
|
|
30
|
+
{function.membershipBtn, group}
|
|
31
|
+
{{{ end }}}
|
|
32
|
+
{{{ if isAdmin }}}
|
|
33
|
+
<a href="{config.relative_path}/admin/manage/groups/{group.nameEncoded}" target="_blank" class="btn btn-light"><i class="fa fa-gear"></i> [[user:edit]]</a>
|
|
34
|
+
{{{ end }}}
|
|
42
35
|
</div>
|
|
43
36
|
</div>
|
|
37
|
+
{group.descriptionParsed}
|
|
38
|
+
</div>
|
|
44
39
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
40
|
+
<div class="row">
|
|
41
|
+
<!-- IMPORT partials/groups/sidebar-left.tpl -->
|
|
42
|
+
|
|
43
|
+
<div class="col-12 col-md-9 col-lg-10 ps-md-5">
|
|
44
|
+
|
|
45
|
+
<div class="tab-content">
|
|
46
|
+
<div class="tab-pane fade show active" id="groups-posts" role="tabpanel">
|
|
47
|
+
<h3 class="fw-semibold fs-5 mb-0">[[global:posts]]</h3>
|
|
48
|
+
{{{ if !posts.length }}}
|
|
49
|
+
<div class="alert alert-info">[[groups:details.has_no_posts]]</div>
|
|
50
|
+
{{{ end }}}
|
|
51
|
+
<!-- IMPORT partials/posts_list.tpl -->
|
|
52
|
+
</div>
|
|
53
|
+
<div class="tab-pane fade" id="groups-members" role="tabpanel">
|
|
54
|
+
<h3 class="fw-semibold fs-5 mb-3">[[groups:details.members]]</h3>
|
|
55
|
+
|
|
56
|
+
<!-- IMPORT partials/groups/memberlist.tpl -->
|
|
57
|
+
</div>
|
|
58
|
+
{{{ if group.isOwner }}}
|
|
59
|
+
<div class="tab-pane fade" id="groups-pending" role="tabpanel">
|
|
60
|
+
<h3 class="fw-semibold fs-5 mb-3">[[groups:details.pending]]</h3>
|
|
61
|
+
<!-- IMPORT partials/groups/pending.tpl -->
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<div class="tab-pane fade" id="groups-invited" role="tabpanel">
|
|
65
|
+
<h3 class="fw-semibold fs-5 mb-3">[[groups:details.invited]]</h3>
|
|
66
|
+
<!-- IMPORT partials/groups/invited.tpl -->
|
|
67
|
+
</div>
|
|
68
|
+
|
|
69
|
+
<div class="tab-pane fade" id="groups-admin" role="tabpanel">
|
|
70
|
+
<h3 class="fw-semibold fs-5 mb-3">[[groups:details.owner_options]]</h3>
|
|
71
|
+
<!-- IMPORT partials/groups/admin.tpl -->
|
|
72
|
+
</div>
|
|
73
|
+
{{{ end }}}
|
|
50
74
|
</div>
|
|
51
|
-
|
|
52
|
-
|
|
75
|
+
|
|
76
|
+
<div data-widget-area="left">
|
|
77
|
+
{{{each widgets.left}}}
|
|
78
|
+
{{widgets.left.html}}
|
|
79
|
+
{{{end}}}
|
|
53
80
|
</div>
|
|
54
81
|
</div>
|
|
82
|
+
<div class="col-lg-8 col-12">
|
|
83
|
+
<div class="col-lg-11">
|
|
55
84
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
{{widgets.left.html}}
|
|
63
|
-
{{{end}}}
|
|
64
|
-
</div>
|
|
65
|
-
</div>
|
|
66
|
-
<div class="col-lg-8 col-12">
|
|
67
|
-
<div class="col-lg-11">
|
|
68
|
-
<!-- IF !posts.length -->
|
|
69
|
-
<div class="alert alert-info">[[groups:details.has_no_posts]]</div>
|
|
70
|
-
<!-- ENDIF !posts.length -->
|
|
71
|
-
<!-- IMPORT partials/posts_list.tpl -->
|
|
72
|
-
</div>
|
|
73
|
-
<div data-widget-area="right">
|
|
74
|
-
{{{each widgets.right}}}
|
|
75
|
-
{{widgets.right.html}}
|
|
76
|
-
{{{end}}}
|
|
85
|
+
</div>
|
|
86
|
+
<div data-widget-area="right">
|
|
87
|
+
{{{each widgets.right}}}
|
|
88
|
+
{{widgets.right.html}}
|
|
89
|
+
{{{end}}}
|
|
90
|
+
</div>
|
|
77
91
|
</div>
|
|
78
92
|
</div>
|
|
79
93
|
</div>
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
<!-- THIS FILE IS STILL PERSONA -->
|
|
2
|
-
|
|
3
1
|
<!-- IMPORT partials/breadcrumbs.tpl -->
|
|
4
2
|
<div data-widget-area="header">
|
|
5
3
|
{{{each widgets.header}}}
|
|
@@ -7,25 +5,32 @@
|
|
|
7
5
|
{{{end}}}
|
|
8
6
|
</div>
|
|
9
7
|
<div class="groups list">
|
|
8
|
+
<h2 class="fw-semibold">[[pages:groups]]</h2>
|
|
10
9
|
<div class="row justify-content-between">
|
|
11
10
|
<div class="col-lg-6">
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
<div class="text-sm d-flex align-items-center gap-2">
|
|
12
|
+
[[topic:sort_by]]
|
|
13
|
+
<a href="?sort=alpha" class="btn-ghost fw-semibold {{{ if (sort == "alpha") }}}active{{{ end }}}">[[groups:details.group_name]]</a>
|
|
14
|
+
<a href="?sort=count" class="btn-ghost fw-semibold {{{ if (sort == "count") }}}active{{{ end }}}">[[groups:details.member_count]]</a>
|
|
15
|
+
<a href="?sort=date" class="btn-ghost fw-semibold {{{ if (sort == "date") }}}active{{{ end }}}">[[groups:details.creation_date]]</a>
|
|
16
|
+
</div>
|
|
15
17
|
</div>
|
|
16
18
|
<div class="col-lg-6">
|
|
17
|
-
<div class="
|
|
18
|
-
<div class="
|
|
19
|
-
|
|
19
|
+
<div class="d-flex justify-content-end gap-2">
|
|
20
|
+
<div class="">
|
|
21
|
+
{{{ if allowGroupCreation }}}
|
|
22
|
+
<button class="btn btn-primary btn-sm" data-action="new"><i class="fa fa-plus"></i> [[groups:new_group]]</button>
|
|
23
|
+
{{{ end }}}
|
|
24
|
+
<select class="form-select hidden" id="search-sort">
|
|
20
25
|
<option value="alpha">[[groups:details.group_name]]</option>
|
|
21
26
|
<option value="count">[[groups:details.member_count]]</option>
|
|
22
27
|
<option value="date">[[groups:details.creation_date]]</option>
|
|
23
28
|
</select>
|
|
24
29
|
</div>
|
|
25
|
-
<div class="
|
|
30
|
+
<div class="">
|
|
26
31
|
<div class="input-group">
|
|
27
|
-
<input type="text" class="form-control" placeholder="[[global:search]]" name="query"
|
|
28
|
-
<button id="search-button" class="btn btn-primary">
|
|
32
|
+
<input type="text" class="form-control form-control-sm" placeholder="[[global:search]]" name="query" id="search-text">
|
|
33
|
+
<button id="search-button" class="btn btn-primary btn-sm">
|
|
29
34
|
<i class="fa fa-search"></i>
|
|
30
35
|
</button>
|
|
31
36
|
</div>
|
package/templates/header.tpl
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
<!-- THIS FILE IS STILL PERSONA -->
|
|
2
|
-
|
|
3
1
|
<!DOCTYPE html>
|
|
4
2
|
<html lang="{function.localeToHTML, userLang, defaultLang}" {{{if languageDirection}}}data-dir="{languageDirection}" style="direction: {languageDirection};"{{{end}}}>
|
|
5
3
|
<head>
|
|
@@ -26,24 +24,39 @@
|
|
|
26
24
|
</head>
|
|
27
25
|
|
|
28
26
|
<body class="{bodyClass} skin-{{{if bootswatchSkin}}}{bootswatchSkin}{{{else}}}noskin{{{end}}}">
|
|
29
|
-
<
|
|
30
|
-
<!-- IMPORT partials/
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
27
|
+
<div class="d-flex justify-content-between pb-4 pb-md-0">
|
|
28
|
+
<!-- IMPORT partials/sidebar-left.tpl -->
|
|
29
|
+
|
|
30
|
+
<main id="panel" class="d-flex flex-column gap-3 flex-grow-1 mt-3">
|
|
31
|
+
{{{ if (brand:logo || config.showSiteTitle)}}}
|
|
32
|
+
<div class="container brand-container">
|
|
33
|
+
<div class="col-12 d-flex border-bottom pb-3 {{{ if config.centerHeaderElements }}}justify-content-center{{{ end }}}">
|
|
34
|
+
<div component="brand/wrapper" class="d-flex align-items-center gap-3 p-2 rounded-1 align-content-stretch ">
|
|
35
|
+
{{{ if brand:logo }}}
|
|
36
|
+
<a component="brand/anchor" href="{{{ if brand:logo:url }}}{brand:logo:url}{{{ else }}}{relative_path}/{{{ end }}}">
|
|
37
|
+
<img component="brand/logo" alt="{brand:logo:alt}" class="{brand:logo:display}" src="{brand:logo}?{config.cache-buster}" />
|
|
38
|
+
</a>
|
|
39
|
+
{{{ end }}}
|
|
35
40
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
{{{ if config.showSiteTitle }}}
|
|
42
|
+
<a component="siteTitle" class="text-truncate align-self-stretch align-items-center d-flex" href="{{{ if title:url }}}{title:url}{{{ else }}}{relative_path}/{{{ end }}}">
|
|
43
|
+
<h1 class="fs-6 fw-bold text-body mb-0">{config.siteTitle}</h1>
|
|
44
|
+
</a>
|
|
45
|
+
{{{ end }}}
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
40
48
|
</div>
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
49
|
+
{{{ end }}}
|
|
50
|
+
<script>
|
|
51
|
+
const headerEl = document.getElementById('header-menu');
|
|
52
|
+
if (headerEl) {
|
|
53
|
+
const rect = headerEl.getBoundingClientRect();
|
|
54
|
+
const offset = Math.max(0, rect.bottom);
|
|
55
|
+
document.documentElement.style.setProperty('--panel-offset', offset + `px`);
|
|
56
|
+
} else {
|
|
57
|
+
document.documentElement.style.setProperty('--panel-offset', `0px`);
|
|
58
|
+
}
|
|
59
|
+
</script>
|
|
60
|
+
<div class="container d-flex flex-column gap-2" id="content">
|
|
61
|
+
<!-- IMPORT partials/noscript/warning.tpl -->
|
|
62
|
+
<!-- IMPORT partials/noscript/message.tpl -->
|
package/templates/login.tpl
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
<!-- THIS FILE IS STILL PERSONA -->
|
|
2
|
-
|
|
3
|
-
<!-- IMPORT partials/breadcrumbs.tpl -->
|
|
4
1
|
<div data-widget-area="header">
|
|
5
2
|
{{{each widgets.header}}}
|
|
6
3
|
{{widgets.header.html}}
|
|
7
4
|
{{{end}}}
|
|
8
5
|
</div>
|
|
9
6
|
<div class="row login">
|
|
10
|
-
<div class="{{{ if widgets.sidebar.length }}}col-lg-9 col-sm-12{{{ else }}}col-lg-12{{{ end }}}">
|
|
11
|
-
<
|
|
7
|
+
<div class="d-flex flex-column gap-2 {{{ if widgets.sidebar.length }}}col-lg-9 col-sm-12{{{ else }}}col-lg-12{{{ end }}}">
|
|
8
|
+
<h2 class="tracking-tight fw-semibold text-center">[[global:login]]</h2>
|
|
9
|
+
<div class="row justify-content-center gap-5">
|
|
12
10
|
{{{ if allowLocalLogin }}}
|
|
13
|
-
<div class="
|
|
11
|
+
<div class="col-12 col-md-3 px-md-0">
|
|
14
12
|
<div class="login-block">
|
|
15
13
|
<div class="alert alert-danger alert-dismissible" id="login-error-notify" {{{ if error }}}style="display:block"{{{ else }}}style="display: none;"{{{ end }}}>
|
|
16
14
|
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
|
|
@@ -18,67 +16,75 @@
|
|
|
18
16
|
<p>{error}</p>
|
|
19
17
|
</div>
|
|
20
18
|
|
|
21
|
-
<form class="
|
|
22
|
-
<div class="
|
|
23
|
-
<label for="username"
|
|
24
|
-
<div
|
|
19
|
+
<form class="d-flex flex-column gap-3" role="form" method="post" id="login-form">
|
|
20
|
+
<div class="mb-2 d-flex flex-column gap-2">
|
|
21
|
+
<label for="username">{allowLoginWith}</label>
|
|
22
|
+
<div>
|
|
25
23
|
<input class="form-control" type="text" placeholder="{allowLoginWith}" name="username" id="username" autocorrect="off" autocapitalize="off" value="{username}"/>
|
|
26
24
|
</div>
|
|
27
25
|
</div>
|
|
28
|
-
<div class="
|
|
29
|
-
<
|
|
30
|
-
|
|
26
|
+
<div class="mb-2 d-flex flex-column gap-2">
|
|
27
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
28
|
+
<label for="password">[[user:password]]</label>
|
|
29
|
+
{{{ if allowPasswordReset }}}
|
|
30
|
+
<a id="reset-link" class="text-sm text-reset text-decoration-underline" href="{config.relative_path}/reset">[[login:forgot_password]]</a>
|
|
31
|
+
{{{ end }}}
|
|
32
|
+
</div>
|
|
33
|
+
<div>
|
|
31
34
|
<input class="form-control" type="password" placeholder="[[user:password]]" name="password" id="password" {{{ if username }}}autocomplete="off"{{{ end }}}/>
|
|
32
35
|
<p id="caps-lock-warning" class="text-danger hidden">
|
|
33
36
|
<i class="fa fa-exclamation-triangle"></i> [[login:caps-lock-enabled]]
|
|
34
37
|
</p>
|
|
35
38
|
</div>
|
|
36
39
|
</div>
|
|
37
|
-
<div class="
|
|
38
|
-
<div class="
|
|
39
|
-
<
|
|
40
|
-
<
|
|
41
|
-
|
|
42
|
-
</label>
|
|
43
|
-
</div>
|
|
40
|
+
<div class="mb-2">
|
|
41
|
+
<div class="checkbox">
|
|
42
|
+
<label>
|
|
43
|
+
<input type="checkbox" name="remember" id="remember" checked /> [[login:remember_me]]
|
|
44
|
+
</label>
|
|
44
45
|
</div>
|
|
45
46
|
</div>
|
|
46
47
|
{{{each loginFormEntry}}}
|
|
47
|
-
<div class="
|
|
48
|
-
<label for="login-{loginFormEntry.styleName}"
|
|
49
|
-
<div id="login-{loginFormEntry.styleName}"
|
|
48
|
+
<div class="mb-2 loginFormEntry d-flex flex-column gap-2">
|
|
49
|
+
<label for="login-{loginFormEntry.styleName}">{loginFormEntry.label}</label>
|
|
50
|
+
<div id="login-{loginFormEntry.styleName}">{{loginFormEntry.html}}</div>
|
|
50
51
|
</div>
|
|
51
52
|
{{{end}}}
|
|
53
|
+
|
|
52
54
|
<input type="hidden" name="_csrf" value="{config.csrf_token}" />
|
|
53
55
|
<input type="hidden" name="noscript" id="noscript" value="true" />
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
{{{ end }}}
|
|
64
|
-
{{{ if allowPasswordReset }}}
|
|
65
|
-
<a id="reset-link" href="{config.relative_path}/reset">[[login:forgot_password]]</a>
|
|
66
|
-
{{{ end }}}
|
|
67
|
-
</div>
|
|
68
|
-
</div>
|
|
56
|
+
|
|
57
|
+
<button class="btn btn-primary" id="login" type="submit">[[global:login]]</button>
|
|
58
|
+
|
|
59
|
+
<hr/>
|
|
60
|
+
|
|
61
|
+
{{{ if allowRegistration }}}
|
|
62
|
+
<span class="text-sm">[[login:dont_have_account]]</span>
|
|
63
|
+
<a class="btn btn-outline-light text-body" href="{config.relative_path}/register">[[register:register]]</a>
|
|
64
|
+
{{{ end }}}
|
|
69
65
|
</form>
|
|
70
66
|
</div>
|
|
71
67
|
</div>
|
|
72
68
|
{{{ end }}}
|
|
73
69
|
|
|
74
70
|
{{{ if alternate_logins }}}
|
|
75
|
-
<div class="
|
|
76
|
-
<div class="alt-login-block">
|
|
77
|
-
<
|
|
78
|
-
<ul class="alt-logins">
|
|
79
|
-
{{{each authentication}}}
|
|
80
|
-
<li class="{
|
|
81
|
-
|
|
71
|
+
<div class="col-12 col-md-3 px-md-0">
|
|
72
|
+
<div class="alt-login-block d-flex flex-column gap-2">
|
|
73
|
+
<label>[[login:alternative_logins]]</label>
|
|
74
|
+
<ul class="alt-logins list-unstyled">
|
|
75
|
+
{{{ each authentication }}}
|
|
76
|
+
<li class="{./name} mb-2">
|
|
77
|
+
<a class="btn btn-outline-light d-flex align-items-center" rel="nofollow noopener noreferrer" target="_top" href="{config.relative_path}{./url}">
|
|
78
|
+
{{{ if ./icons.svg }}}
|
|
79
|
+
{./icons.svg}
|
|
80
|
+
{{{ else }}}
|
|
81
|
+
<i class="{./icons.normal}" style="color:{./color};"></i>
|
|
82
|
+
{{{ end }}}
|
|
83
|
+
{{{ if ./labels.login }}}
|
|
84
|
+
<div class="flex-1 text-body text-sm">{./labels.login}</div>
|
|
85
|
+
{{{ end }}}
|
|
86
|
+
</a></li>
|
|
87
|
+
{{{ end }}}
|
|
82
88
|
</ul>
|
|
83
89
|
</div>
|
|
84
90
|
</div>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<div class="btn-group bottom-sheet">
|
|
2
|
+
<button type="button" class="btn btn-light dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
3
|
+
<i class="fa fa-gear fa-fw"></i>
|
|
4
|
+
</button>
|
|
5
|
+
<ul class="dropdown-menu dropdown-menu-end account-sub-links">
|
|
6
|
+
<li>
|
|
7
|
+
<a class="dropdown-item" href="{config.relative_path}/user/{userslug}/info">[[user:account_info]]</a>
|
|
8
|
+
</li>
|
|
9
|
+
{{{ if (canBan || canMute) }}}
|
|
10
|
+
<li role="separator" class="dropdown-divider"></li>
|
|
11
|
+
{{{ end }}}
|
|
12
|
+
{{{ if canBan }}}
|
|
13
|
+
<li class="{{{ if banned }}}hide{{{ end }}}">
|
|
14
|
+
<a class="dropdown-item" component="account/ban" href="#">[[user:ban_account]]</a>
|
|
15
|
+
</li>
|
|
16
|
+
<li class="{{{ if !banned }}}hide{{{ end }}}">
|
|
17
|
+
<a class="dropdown-item" component="account/unban" href="#">[[user:unban_account]]</a>
|
|
18
|
+
</li>
|
|
19
|
+
{{{ end }}}
|
|
20
|
+
{{{ if canMute }}}
|
|
21
|
+
<li class="{{{ if muted }}}hide{{{ end }}}">
|
|
22
|
+
<a class="dropdown-item" component="account/mute" href="#">[[user:mute_account]]</a>
|
|
23
|
+
</li>
|
|
24
|
+
<li class="{{{ if !muted }}}hide{{{ end }}}">
|
|
25
|
+
<a class="dropdown-item" component="account/unmute" href="#">[[user:unmute_account]]</a>
|
|
26
|
+
</li>
|
|
27
|
+
{{{ end }}}
|
|
28
|
+
{{{ if isAdmin }}}
|
|
29
|
+
<li>
|
|
30
|
+
<a component="account/delete-account" href="#" class="dropdown-item">[[user:delete_account_as_admin]]</a>
|
|
31
|
+
<a component="account/delete-content" href="#" class="dropdown-item">[[user:delete_content]]</a>
|
|
32
|
+
<a component="account/delete-all" href="#" class="dropdown-item">[[user:delete_all]]</a>
|
|
33
|
+
</li>
|
|
34
|
+
{{{ end }}}
|
|
35
|
+
</ul>
|
|
36
|
+
</div>
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
<li component="categories/category" data-cid="{../cid}" data-parent-cid="{../parentCid}" class="row clearfix">
|
|
4
|
-
<meta itemprop="name" content="{../name}">
|
|
5
|
-
|
|
1
|
+
<li component="categories/category" data-cid="{./cid}" class="row category-{./cid} mb-4">
|
|
2
|
+
<meta itemprop="name" content="{./name}">
|
|
6
3
|
<div class="content col-10 depth-{../depth}">
|
|
7
|
-
<div class="
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
<div class="d-flex">
|
|
5
|
+
<div class="fs-3">
|
|
6
|
+
{buildCategoryIcon(@value, "40px", "rounded-1")}
|
|
7
|
+
</div>
|
|
10
8
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
9
|
+
<div class="ms-3">
|
|
10
|
+
<h3 class="title">
|
|
11
|
+
<!-- IMPORT partials/categories/link.tpl -->
|
|
12
|
+
</h3>
|
|
13
|
+
<!-- description -->
|
|
14
|
+
<div class="mb-2">
|
|
15
|
+
{{{ if ../descriptionParsed }}}
|
|
16
|
+
<div class="description text-muted">{../descriptionParsed}</div>
|
|
17
|
+
{{{ end }}}
|
|
18
|
+
</div>
|
|
18
19
|
</div>
|
|
19
|
-
<!-- ENDIF ../descriptionParsed -->
|
|
20
20
|
</div>
|
|
21
21
|
</div>
|
|
22
22
|
<div class="col-2">
|
|
23
|
-
|
|
23
|
+
<!-- IMPORT partials/category/watch.tpl -->
|
|
24
24
|
</div>
|
|
25
25
|
</li>
|
|
@@ -1,48 +1,90 @@
|
|
|
1
|
-
<!-- THIS FILE IS STILL PERSONA -->
|
|
2
|
-
|
|
3
|
-
<!-- IMPORT partials/breadcrumbs.tpl -->
|
|
4
|
-
|
|
5
1
|
<div data-widget-area="header">
|
|
6
2
|
{{{each widgets.header}}}
|
|
7
3
|
{{widgets.header.html}}
|
|
8
4
|
{{{end}}}
|
|
9
5
|
</div>
|
|
10
6
|
|
|
11
|
-
<div class="cover" component="account/cover" style="background-image: url({cover:url}); background-position: {cover:position};">
|
|
12
|
-
<div class="
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
7
|
+
<div class="cover position-absolute start-0 top-0 w-100" component="account/cover" style="background-image: url({cover:url}); background-position: {cover:position};">
|
|
8
|
+
<div class="container">
|
|
9
|
+
{{{ if allowCoverPicture }}}
|
|
10
|
+
{{{ if canEdit }}}
|
|
11
|
+
<div class="controls">
|
|
12
|
+
<span class="upload"><i class="fa fa-fw fa-2x fa-upload"></i></span>
|
|
13
|
+
<span class="resize"><i class="fa fa-fw fa-2x fa-arrows"></i></span>
|
|
14
|
+
<span class="remove"><i class="fa fa-fw fa-2x fa-times"></i></span>
|
|
15
|
+
</div>
|
|
16
|
+
<div class="save text-bg-primary">[[groups:cover-save]] <i class="fa fa-fw fa-floppy-o"></i></div>
|
|
17
|
+
<div class="indicator text-bg-primary">[[groups:cover-saving]] <i class="fa fa-fw fa-refresh fa-spin"></i></div>
|
|
18
|
+
{{{ end }}}
|
|
19
|
+
{{{ end }}}
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
19
22
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
</span>
|
|
28
|
-
</button>
|
|
29
|
-
<!-- ENDIF !isSelf -->
|
|
30
|
-
<!-- ENDIF loggedIn -->
|
|
23
|
+
<div class="d-flex gap-2 w-100 mb-4 mt-2">
|
|
24
|
+
<div class="avatar-wrapper border-4 position-relative align-self-start d-none d-md-block" style="margin-top: -60px;">
|
|
25
|
+
{{{ if picture }}}
|
|
26
|
+
<img src="{picture}" class="avatar avatar-rounded" style="--avatar-size: 142px;" />
|
|
27
|
+
{{{ else }}}
|
|
28
|
+
<div class="avatar avatar-rounded" style="background-color: {icon:bgColor}; --avatar-size: 142px;" title="{username}">{icon:text}</div>
|
|
29
|
+
{{{ end }}}
|
|
31
30
|
</div>
|
|
31
|
+
<div class="d-flex flex-1 flex-column gap-2">
|
|
32
|
+
<!-- IMPORT partials/breadcrumbs.tpl -->
|
|
33
|
+
<div class="d-grid gap-1">
|
|
34
|
+
<h2 class="fullname fw-semibold fs-3">{{{ if fullname }}}{fullname}{{{ else }}}{username}{{{ end }}}</h2>
|
|
35
|
+
<div class="d-flex flex-wrap gap-1 text-sm align-items-center">
|
|
36
|
+
<span class="username fw-bold">{{{ if !banned }}}@{username}{{{ else }}}[[user:banned]]{{{ end }}}</span>
|
|
37
|
+
<div class="d-flex align-items-center gap-1 p-1">
|
|
38
|
+
{{{ if selectedGroup.length }}}
|
|
39
|
+
{{{ each selectedGroup }}}
|
|
40
|
+
{{{ if ./slug }}}
|
|
41
|
+
<!-- IMPORT partials/groups/badge.tpl -->
|
|
42
|
+
{{{ end }}}
|
|
43
|
+
{{{ end }}}
|
|
44
|
+
{{{ end }}}
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
32
47
|
|
|
33
|
-
|
|
34
|
-
|
|
48
|
+
{{{ if isAdminOrGlobalModeratorOrModerator }}}
|
|
49
|
+
{{{ if banned }}}
|
|
50
|
+
<div class="text-xm text-muted">
|
|
51
|
+
{{{ if banned_until }}}
|
|
52
|
+
[[user:info.banned-until, {banned_until_readable}]]
|
|
53
|
+
{{{ else }}}
|
|
54
|
+
[[user:info.banned-permanently]]
|
|
55
|
+
{{{ end }}}
|
|
56
|
+
</div>
|
|
57
|
+
{{{ end }}}
|
|
58
|
+
{{{ end }}}
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
35
61
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
62
|
+
<div class="d-flex gap-1 align-self-start">
|
|
63
|
+
{{{ if loggedIn }}}
|
|
64
|
+
{{{ if !isSelf }}}
|
|
65
|
+
<a component="account/unfollow" href="#" class="btn btn-info{{{ if !isFollowing }}} hide{{{ end }}}">[[user:unfollow]]</a>
|
|
66
|
+
<a component="account/follow" href="#" class="btn btn-primary{{{ if isFollowing }}} hide{{{ end }}}">[[user:follow]]</a>
|
|
67
|
+
{{{ end }}}
|
|
68
|
+
{{{ end }}}
|
|
69
|
+
|
|
70
|
+
{{{ if (loggedIn && (!isSelf && (!banned && !config.disableChat))) }}}
|
|
71
|
+
<div class="btn-group">
|
|
72
|
+
<a {{{ if hasPrivateChat }}}component="account/chat"{{{ else }}}component="account/new-chat"{{{ end }}} href="#" class="btn btn-light" role="button">[[user:chat]]</a>
|
|
73
|
+
{{{ if hasPrivateChat}}}
|
|
74
|
+
<button type="button" class="btn btn-light dropdown-toggle" data-bs-toggle="dropdown">
|
|
75
|
+
<i class="fa fa-caret-down"></i>
|
|
76
|
+
</button>
|
|
77
|
+
<ul class="dropdown-menu dropdown-menu-end" role="menu">
|
|
78
|
+
<li><a class="dropdown-item" href="#" component="account/new-chat">[[user:new_chat_with, {username}]]</a></li>
|
|
79
|
+
</ul>
|
|
80
|
+
{{{ end }}}
|
|
42
81
|
</div>
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
<!--
|
|
82
|
+
{{{ end }}}
|
|
83
|
+
{{{ if !isSelf }}}
|
|
84
|
+
{{{ if (isAdmin || (canBan || canMute ))}}}
|
|
85
|
+
<!-- IMPORT partials/account/admin-menu.tpl -->
|
|
86
|
+
{{{ end }}}
|
|
87
|
+
{{{ end }}}
|
|
47
88
|
</div>
|
|
48
89
|
</div>
|
|
90
|
+
|