nodebb-theme-harmony 2.0.0-pre.9 → 2.0.0
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/README.md +3 -0
- package/library.js +1 -7
- package/package-lock.json +372 -402
- package/package.json +2 -2
- package/plugin.json +1 -2
- package/public/harmony.js +15 -15
- package/scss/common.scss +2 -8
- package/scss/harmony.scss +0 -1
- package/scss/header.scss +1 -1
- package/scss/mixins.scss +12 -5
- package/scss/modules/cover.scss +2 -4
- package/scss/modules/topics-list.scss +1 -1
- package/scss/overrides.scss +4 -0
- package/scss/sidebar.scss +18 -19
- package/scss/skins.scss +9 -0
- package/scss/topic.scss +4 -12
- package/templates/account/blocks.tpl +18 -7
- package/templates/account/categories.tpl +1 -1
- package/templates/account/consent.tpl +2 -2
- package/templates/account/edit/password.tpl +8 -8
- package/templates/account/edit/username.tpl +2 -3
- package/templates/account/edit.tpl +30 -15
- package/templates/account/info.tpl +142 -73
- package/templates/account/posts.tpl +7 -7
- package/templates/account/profile.tpl +19 -22
- package/templates/account/read.tpl +1 -0
- package/templates/account/settings.tpl +5 -5
- package/templates/account/shares.tpl +20 -0
- package/templates/account/topics.tpl +6 -5
- package/templates/admin/plugins/harmony.tpl +1 -0
- package/templates/footer.tpl +1 -1
- package/templates/groups/list.tpl +9 -7
- package/templates/notifications.tpl +1 -1
- package/templates/partials/account/header.tpl +15 -15
- package/templates/partials/account/sidebar-left.tpl +30 -16
- package/templates/partials/breadcrumbs-json-ld.tpl +15 -25
- package/templates/partials/categories/item.tpl +8 -8
- package/templates/partials/categories/lastpost.tpl +1 -1
- package/templates/partials/category/subcategory.tpl +1 -1
- package/templates/partials/groups/list.tpl +1 -1
- package/templates/partials/groups/memberlist.tpl +1 -1
- package/templates/partials/groups/sidebar-left.tpl +8 -8
- package/templates/partials/header/brand.tpl +3 -1
- package/templates/partials/mobile-footer.tpl +3 -6
- package/templates/partials/notifications_list.tpl +2 -2
- package/templates/partials/post_bar.tpl +3 -5
- package/templates/partials/posts_list_item.tpl +1 -1
- package/templates/partials/quick-search-results.tpl +5 -5
- package/templates/partials/search-filters.tpl +1 -1
- package/templates/partials/search-results.tpl +1 -1
- package/templates/partials/sidebar/chats.tpl +1 -1
- package/templates/partials/sidebar/notifications.tpl +1 -1
- package/templates/partials/sidebar/search.tpl +2 -2
- package/templates/partials/sidebar-left.tpl +2 -5
- package/templates/partials/tags_list.tpl +6 -4
- package/templates/partials/topic/event.tpl +1 -1
- package/templates/partials/topic/navigator.tpl +2 -2
- package/templates/partials/topic/post-menu-list.tpl +20 -4
- package/templates/partials/topic/post-menu.tpl +3 -29
- package/templates/partials/topic/post.tpl +108 -101
- package/templates/partials/topic/quickreply.tpl +2 -2
- package/templates/partials/topic/reply-button.tpl +4 -2
- package/templates/partials/topic/sort.tpl +1 -1
- package/templates/partials/topic/thumbs.tpl +1 -1
- package/templates/partials/topic/tools.tpl +2 -6
- package/templates/partials/topic/watch.tpl +1 -1
- package/templates/partials/topic-filters.tpl +1 -1
- package/templates/partials/topic-list-bar.tpl +6 -6
- package/templates/partials/topic-terms.tpl +1 -1
- package/templates/partials/topics_list.tpl +12 -4
- package/templates/partials/users/item.tpl +33 -31
- package/templates/partials/users_list_menu.tpl +5 -5
- package/templates/post-queue.tpl +6 -2
- package/templates/recent.tpl +7 -0
- package/templates/topic.tpl +81 -88
- package/templates/users.tpl +2 -2
- package/templates/world.tpl +32 -1
- package/scss/modules/bottom-sheet.scss +0 -52
- package/templates/flags/detail.tpl +0 -179
- package/templates/flags/list.tpl +0 -6
- package/templates/login.tpl +0 -102
- package/templates/partials/category/filter-dropdown-content.tpl +0 -41
- package/templates/partials/category/selector-dropdown-content.tpl +0 -39
- package/templates/partials/category/sort.tpl +0 -39
- package/templates/partials/category/tools.tpl +0 -89
- package/templates/partials/category/watch.tpl +0 -67
- package/templates/partials/flags/bulk-actions.tpl +0 -9
- package/templates/partials/flags/filters.tpl +0 -189
- package/templates/partials/flags/results.tpl +0 -38
- package/templates/partials/groups/filter-dropdown-content.tpl +0 -25
- package/templates/partials/tags/filter-dropdown-content.tpl +0 -38
- package/templates/partials/tags/watch.tpl +0 -42
- package/templates/partials/users/filter-dropdown-content.tpl +0 -23
- package/templates/register.tpl +0 -104
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
<div component="flags/filters" class="d-flex flex-wrap gap-2 pb-3 border-bottom">
|
|
2
|
-
<div class="btn-group bottom-sheet">
|
|
3
|
-
<a class="filter-btn btn btn-light btn-sm border {{{ if filters.quick }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-haspopup="true" aria-expanded="false">
|
|
4
|
-
<span class="filter-label">{{{ if filters.quick }}}[[flags:filter-quick-{./filters.quick}]]{{{ else }}}[[flags:quick-filters]]{{{ end }}}</span>
|
|
5
|
-
<span class="caret text-primary opacity-75"></span>
|
|
6
|
-
</a>
|
|
7
|
-
<ul class="dropdown-menu p-1 text-sm" role="menu">
|
|
8
|
-
<li>
|
|
9
|
-
<a class="dropdown-item rounded-1" href="{config.relative_path}/flags?quick=mine" role="menuitem">[[flags:filter-quick-mine]]</a>
|
|
10
|
-
</li>
|
|
11
|
-
</ul>
|
|
12
|
-
</div>
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
<div component="category/dropdown" class="btn-group category-dropdown-container bottom-sheet">
|
|
16
|
-
<button type="button" class="filter-btn btn btn-light btn-sm border d-flex gap-2 dropdown-toggle {{{ if filters.cid }}}active-filter{{{ end }}}" data-bs-toggle="dropdown">
|
|
17
|
-
{{{ if selectedCategory }}}
|
|
18
|
-
<span class="category-item d-inline-flex align-items-center gap-1">
|
|
19
|
-
{buildCategoryIcon(selectedCategory, "18px", "rounded-circle")}
|
|
20
|
-
<span class="visible-md-inline visible-lg-inline">{selectedCategory.name}</span>
|
|
21
|
-
</span>
|
|
22
|
-
{{{ else }}}
|
|
23
|
-
<span class="visible-md-inline visible-lg-inline">[[unread:all-categories]]</span>
|
|
24
|
-
{{{ end }}}
|
|
25
|
-
<span class="caret text-primary opacity-75"></span>
|
|
26
|
-
</button>
|
|
27
|
-
<div component="category-selector-search" class="hidden position-absolute">
|
|
28
|
-
<input type="text" class="form-control form-control-sm" placeholder="[[search:type-to-search]]" autocomplete="off">
|
|
29
|
-
</div>
|
|
30
|
-
|
|
31
|
-
<div class="dropdown-menu p-1">
|
|
32
|
-
<ul component="category/list" class="list-unstyled mb-0 text-sm category-dropdown-menu ghost-scrollbar" role="menu">
|
|
33
|
-
{{{each categoryItems}}}
|
|
34
|
-
<li role="presentation" class="category {{{ if ../disabledClass }}}disabled{{{ end }}}" data-cid="{../cid}" data-parent-cid="{../parentCid}" data-name="{../name}">
|
|
35
|
-
<a class="dropdown-item rounded-1 d-flex align-items-center gap-2" role="menuitem" href="#">
|
|
36
|
-
{../level}
|
|
37
|
-
<span component="category-markup" class="flex-grow-1" style="{{{ if ../match }}}font-weight: bold;{{{end}}}">
|
|
38
|
-
<div class="category-item d-inline-flex align-items-center gap-1">
|
|
39
|
-
{{{ if ./icon }}}
|
|
40
|
-
{buildCategoryIcon(@value, "24px", "rounded-circle")}
|
|
41
|
-
{{{ end }}}
|
|
42
|
-
{./name}
|
|
43
|
-
</div>
|
|
44
|
-
</span>
|
|
45
|
-
<i component="category/select/icon" class="flex-shrink-0 fa fa-fw fa-check {{{ if !../selected }}}invisible{{{ end }}}"></i>
|
|
46
|
-
</a>
|
|
47
|
-
</li>
|
|
48
|
-
{{{end}}}
|
|
49
|
-
</ul>
|
|
50
|
-
</div>
|
|
51
|
-
</div>
|
|
52
|
-
|
|
53
|
-
<div class="btn-group bottom-sheet">
|
|
54
|
-
<a class="filter-btn btn btn-light btn-sm border {{{ if (sort != "newest") }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-haspopup="true" aria-expanded="false">
|
|
55
|
-
<span class="filter-label">{{{ if (sort != "newest") }}}[[flags:sort-{./sort}]]{{{ else }}}[[flags:sort]]{{{ end }}}</span>
|
|
56
|
-
<span class="caret text-primary opacity-75"></span>
|
|
57
|
-
</a>
|
|
58
|
-
<ul class="dropdown-menu p-1 text-sm" role="menu">
|
|
59
|
-
<li><h6 class="dropdown-header">[[flags:sort-all]]</h6></li>
|
|
60
|
-
<li class="dropdown-item rounded-1" data-name="sort" data-value="newest" role="menuitem">[[flags:sort-newest]]</li>
|
|
61
|
-
<li class="dropdown-item rounded-1" data-name="sort" data-value="oldest" role="menuitem">[[flags:sort-oldest]]</li>
|
|
62
|
-
<li class="dropdown-item rounded-1" data-name="sort" data-value="reports" role="menuitem">[[flags:sort-reports]]</li>
|
|
63
|
-
<li><h6 class="dropdown-header">[[flags:sort-posts-only]]</h6></li>
|
|
64
|
-
<li class="dropdown-item rounded-1" data-name="sort" data-value="downvotes" role="menuitem">[[flags:sort-downvotes]]</li>
|
|
65
|
-
<li class="dropdown-item rounded-1" data-name="sort" data-value="upvotes" role="menuitem">[[flags:sort-upvotes]]</li>
|
|
66
|
-
<li class="dropdown-item rounded-1" data-name="sort" data-value="replies" role="menuitem">[[flags:sort-replies]]</li>
|
|
67
|
-
</ul>
|
|
68
|
-
</div>
|
|
69
|
-
|
|
70
|
-
<div class="btn-group bottom-sheet">
|
|
71
|
-
<a class="filter-btn btn btn-light btn-sm border {{{ if filters.state }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-haspopup="true" aria-expanded="false">
|
|
72
|
-
<span class="filter-label">{{{ if filters.state }}}[[flags:state-{./filters.state}]]{{{ else }}}[[flags:filter-state]]{{{ end }}}</span>
|
|
73
|
-
<span class="caret text-primary opacity-75"></span>
|
|
74
|
-
</a>
|
|
75
|
-
<ul class="dropdown-menu p-1 text-sm" role="menu">
|
|
76
|
-
<li class="dropdown-item rounded-1" data-name="state" data-value="open" role="menuitem">[[flags:state-open]]</li>
|
|
77
|
-
<li class="dropdown-item rounded-1" data-name="state" data-value="wip" role="menuitem">[[flags:state-wip]]</li>
|
|
78
|
-
<li class="dropdown-item rounded-1" data-name="state" data-value="resolved" role="menuitem">[[flags:state-resolved]]</li>
|
|
79
|
-
<li class="dropdown-item rounded-1" data-name="state" data-value="rejected" role="menuitem">[[flags:state-rejected]]</li>
|
|
80
|
-
</ul>
|
|
81
|
-
</div>
|
|
82
|
-
|
|
83
|
-
<div class="btn-group bottom-sheet">
|
|
84
|
-
<a class="filter-btn btn btn-light btn-sm border {{{ if filters.type }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-haspopup="true" aria-expanded="false">
|
|
85
|
-
<span class="filter-label">{{{ if filters.type }}}[[flags:filter-type-{./filters.type}]]{{{ else }}}[[flags:filter-type]]{{{ end }}}</span>
|
|
86
|
-
<span class="caret text-primary opacity-75"></span>
|
|
87
|
-
</a>
|
|
88
|
-
<ul class="dropdown-menu p-1 text-sm" role="menu">
|
|
89
|
-
<li class="dropdown-item rounded-1" data-name="type" data-value="all" role="menuitem">[[flags:filter-type-all]]</li>
|
|
90
|
-
<li class="dropdown-item rounded-1" data-name="type" data-value="post" role="menuitem">[[flags:filter-type-post]]</li>
|
|
91
|
-
<li class="dropdown-item rounded-1" data-name="type" data-value="user" role="menuitem">[[flags:filter-type-user]]</li>
|
|
92
|
-
</ul>
|
|
93
|
-
</div>
|
|
94
|
-
|
|
95
|
-
<div component="flags/filter/assignee" class="dropdown bottom-sheet" data-filter-name="assignee">
|
|
96
|
-
<a component="user/filter/button" class="filter-btn btn btn-light btn-sm border {{{ if filters.assignee }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-haspopup="true" aria-expanded="false">
|
|
97
|
-
<span class="filter-label">[[flags:filter-assignee]]</span>
|
|
98
|
-
<span class="caret text-primary opacity-75"></span>
|
|
99
|
-
</a>
|
|
100
|
-
|
|
101
|
-
<ul class="dropdown-menu p-1 text-sm" style="min-width: 350px;" role="menu">
|
|
102
|
-
<li class="px-3 py-1 d-flex flex-column gap-2">
|
|
103
|
-
<input type="text" class="form-control" component="user/filter/search" placeholder="[[search:type-a-username]]">
|
|
104
|
-
<div component="user/filter/selected" class="d-flex flex-wrap gap-2">
|
|
105
|
-
{{{ each selected.assignee }}}
|
|
106
|
-
<div class="d-flex px-2 py-1 rounded-1 text-bg-primary gap-2 align-items-center text-sm">
|
|
107
|
-
{buildAvatar(@value, "16px", true)} {./username}
|
|
108
|
-
<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>
|
|
109
|
-
</div>
|
|
110
|
-
{{{ end }}}
|
|
111
|
-
</div>
|
|
112
|
-
<hr/>
|
|
113
|
-
<div component="user/filter/results" class="d-flex flex-wrap gap-2">
|
|
114
|
-
{{{ each userFilterResults }}}
|
|
115
|
-
<button class="btn btn-light btn-sm border" data-uid="{./uid}" data-username="{./username}">{buildAvatar(@value, "16px", true)} {./username}</button>
|
|
116
|
-
{{{ end }}}
|
|
117
|
-
</div>
|
|
118
|
-
</li>
|
|
119
|
-
</ul>
|
|
120
|
-
</div>
|
|
121
|
-
|
|
122
|
-
<div component="flags/filter/reporterId" class="dropdown bottom-sheet" data-filter-name="reporterId">
|
|
123
|
-
<a component="user/filter/button" class="filter-btn btn btn-light btn-sm border {{{ if filters.reporterId }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-haspopup="true" aria-expanded="false">
|
|
124
|
-
<span class="filter-label">[[flags:filter-reporterId]]</span>
|
|
125
|
-
<span class="caret text-primary opacity-75"></span>
|
|
126
|
-
</a>
|
|
127
|
-
|
|
128
|
-
<ul class="dropdown-menu p-1 text-sm" style="min-width: 350px;" role="menu">
|
|
129
|
-
<li class="px-3 py-1 d-flex flex-column gap-2">
|
|
130
|
-
<input type="text" class="form-control" component="user/filter/search" placeholder="[[search:type-a-username]]">
|
|
131
|
-
<div component="user/filter/selected" class="d-flex flex-wrap gap-2">
|
|
132
|
-
{{{ each selected.reporterId }}}
|
|
133
|
-
<div class="d-flex px-2 py-1 rounded-1 text-bg-primary gap-2 align-items-center text-sm">
|
|
134
|
-
{buildAvatar(@value, "16px", true)} {./username}
|
|
135
|
-
<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>
|
|
136
|
-
</div>
|
|
137
|
-
{{{ end }}}
|
|
138
|
-
</div>
|
|
139
|
-
<hr/>
|
|
140
|
-
<div component="user/filter/results" class="d-flex flex-wrap gap-2">
|
|
141
|
-
{{{ each userFilterResults }}}
|
|
142
|
-
<button class="btn btn-light btn-sm border" data-uid="{./uid}" data-username="{./username}">{buildAvatar(@value, "16px", true)} {./username}</button>
|
|
143
|
-
{{{ end }}}
|
|
144
|
-
</div>
|
|
145
|
-
</li>
|
|
146
|
-
</ul>
|
|
147
|
-
</div>
|
|
148
|
-
|
|
149
|
-
<div component="flags/filter/targetUid" class="dropdown bottom-sheet" data-filter-name="targetUid">
|
|
150
|
-
<a component="user/filter/button" class="filter-btn btn btn-light btn-sm border {{{ if filters.targetUid }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-haspopup="true" aria-expanded="false">
|
|
151
|
-
<span class="filter-label">[[flags:filter-targetUid]]</span>
|
|
152
|
-
<span class="caret text-primary opacity-75"></span>
|
|
153
|
-
</a>
|
|
154
|
-
|
|
155
|
-
<ul class="dropdown-menu p-1 text-sm" style="min-width: 350px;" role="menu">
|
|
156
|
-
<li class="px-3 py-1 d-flex flex-column">
|
|
157
|
-
<input type="text" class="form-control" component="user/filter/search" placeholder="[[search:type-a-username]]">
|
|
158
|
-
<div component="user/filter/selected" class="d-flex flex-wrap gap-2">
|
|
159
|
-
{{{ each selected.targetUid }}}
|
|
160
|
-
<div class="d-flex px-2 py-1 rounded-1 text-bg-primary gap-2 align-items-center text-sm">
|
|
161
|
-
{buildAvatar(@value, "16px", true)} {./username}
|
|
162
|
-
<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>
|
|
163
|
-
</div>
|
|
164
|
-
{{{ end }}}
|
|
165
|
-
</div>
|
|
166
|
-
<hr/>
|
|
167
|
-
<div component="user/filter/results" class="d-flex flex-wrap gap-2">
|
|
168
|
-
{{{ each userFilterResults }}}
|
|
169
|
-
<button class="btn btn-light btn-sm border" data-uid="{./uid}" data-username="{./username}">{buildAvatar(@value, "16px", true)} {./username}</button>
|
|
170
|
-
{{{ end }}}
|
|
171
|
-
</div>
|
|
172
|
-
</li>
|
|
173
|
-
</ul>
|
|
174
|
-
</div>
|
|
175
|
-
|
|
176
|
-
<div component="flags/filters/reset" class="ms-auto">
|
|
177
|
-
<a class="filter-btn btn btn-warning btn-sm border {{{ if !hasFilter }}}btn-light disabled{{{ end }}}" href="{config.relative_path}/flags" role="button">
|
|
178
|
-
<span class="filter-label">[[flags:filter-reset]]</span>
|
|
179
|
-
</a>
|
|
180
|
-
</div>
|
|
181
|
-
|
|
182
|
-
<!-- IMPORT partials/flags/bulk-actions.tpl -->
|
|
183
|
-
|
|
184
|
-
<form role="form">
|
|
185
|
-
<input type="hidden" name="sort" value="{./sort}" />
|
|
186
|
-
<input type="hidden" name="state" value="{./filters.state}" />
|
|
187
|
-
<input type="hidden" name="type" value="{./filters.type}" />
|
|
188
|
-
</form>
|
|
189
|
-
</div>
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
<div class="card card-header text-xs px-2 py-1 fw-semibold border-0 align-self-start">
|
|
2
|
-
[[flags:x-flags-found, {count}]]
|
|
3
|
-
</div>
|
|
4
|
-
|
|
5
|
-
<table class="table table-striped table-hover" component="flags/list">
|
|
6
|
-
<thead>
|
|
7
|
-
<tr>
|
|
8
|
-
<th></th>
|
|
9
|
-
<th class="text-xs text-muted">[[flags:reports]]</th>
|
|
10
|
-
<th class="text-xs text-muted">[[flags:first-reported]]</th>
|
|
11
|
-
<th class="text-xs text-muted">[[flags:state]]</th>
|
|
12
|
-
<th>
|
|
13
|
-
<input type="checkbox" data-action="toggle-all" autocomplete="off" />
|
|
14
|
-
</th>
|
|
15
|
-
</tr>
|
|
16
|
-
</thead>
|
|
17
|
-
<tbody>
|
|
18
|
-
{{{ each flags }}}
|
|
19
|
-
<tr data-flag-id="{./flagId}">
|
|
20
|
-
<td>
|
|
21
|
-
<a class="text-reset text-decoration-underline" href="{config.relative_path}/flags/{./flagId}">
|
|
22
|
-
{./target_readable}
|
|
23
|
-
</a>
|
|
24
|
-
</td>
|
|
25
|
-
<td>
|
|
26
|
-
{./heat}
|
|
27
|
-
</td>
|
|
28
|
-
<td><span class="timeago" title="{./datetimeISO}"></span></td>
|
|
29
|
-
<td><span class="badge bg-{./labelClass}">[[flags:state-{./state}]]</span></td>
|
|
30
|
-
<td>
|
|
31
|
-
<input type="checkbox" autocomplete="off" />
|
|
32
|
-
</td>
|
|
33
|
-
</tr>
|
|
34
|
-
{{{end}}}
|
|
35
|
-
</tbody>
|
|
36
|
-
</table>
|
|
37
|
-
|
|
38
|
-
<!-- IMPORT partials/paginator.tpl -->
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
<div class="dropdown bottom-sheet">
|
|
2
|
-
<button type="button" class="btn-ghost-sm ff-secondary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
3
|
-
{{{ if selectedGroup }}}
|
|
4
|
-
<span class="fw-semibold">{selectedGroup.displayName}</span>
|
|
5
|
-
{{{ else }}}
|
|
6
|
-
<span class="fw-semibold">[[groups:all-groups]]</span>
|
|
7
|
-
{{{ end }}} <span class="caret text-primary opacity-75"></span>
|
|
8
|
-
</button>
|
|
9
|
-
<ul class="dropdown-menu p-1 text-sm" role="menu">
|
|
10
|
-
<li role="presentation" class="user {{{ if !selectedGroup}}}selected{{{end}}}">
|
|
11
|
-
<a class="dropdown-item rounded-1 d-flex align-items-center gap-2" role="menuitem" href="{config.relative_path}/{allGroupsUrl}">
|
|
12
|
-
<div class="flex-grow-1">[[groups:all-groups]]</div>
|
|
13
|
-
<i class="flex-shrink-0 fa fa-fw {{{ if !selectedGroup }}}fa-check{{{ end }}}"></i>
|
|
14
|
-
</a>
|
|
15
|
-
</li>
|
|
16
|
-
{{{ each groups }}}
|
|
17
|
-
<li role="presentation" class="user {{{ if ./selected}}}selected{{{end}}}">
|
|
18
|
-
<a class="dropdown-item rounded-1 d-flex align-items-center gap-2" role="menuitem" href="{config.relative_path}/{./url}">
|
|
19
|
-
<div class="flex-grow-1 d-inline-flex gap-1 align-items-center">{./displayName}</div>
|
|
20
|
-
<i class="flex-shrink-0 fa fa-fw {{{ if ./selected }}}fa-check{{{ end }}}"></i>
|
|
21
|
-
</a>
|
|
22
|
-
</li>
|
|
23
|
-
{{{end}}}
|
|
24
|
-
</ul>
|
|
25
|
-
</div>
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
<button type="button" class="btn-ghost-sm ff-secondary d-flex gap-2 dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
2
|
-
{{{ if selectedTag }}}
|
|
3
|
-
<span class="d-inline-flex align-items-center gap-1">
|
|
4
|
-
<i class="fa fa-fw fa-tags text-primary"></i>
|
|
5
|
-
<span class="visible-md-inline visible-lg-inline fw-semibold">{selectedTag.label}</span>
|
|
6
|
-
</span>
|
|
7
|
-
{{{ else }}}
|
|
8
|
-
<i class="fa fa-fw fa-tags text-primary"></i>
|
|
9
|
-
<span class="visible-md-inline visible-lg-inline fw-semibold">[[tags:all-tags]]</span>
|
|
10
|
-
{{{ end }}}
|
|
11
|
-
</button>
|
|
12
|
-
|
|
13
|
-
<div component="tag/filter/search" class="hidden position-absolute top-0">
|
|
14
|
-
<input type="text" class="form-control form-control-sm" placeholder="[[search:type-to-search]]" autocomplete="off">
|
|
15
|
-
</div>
|
|
16
|
-
|
|
17
|
-
<div class="dropdown-menu p-1">
|
|
18
|
-
<ul component="tag/filter/list" class="list-unstyled mb-0 text-sm overflow-auto ghost-scrollbar" role="menu" style="max-height: 500px;" role="menu">
|
|
19
|
-
<li role="presentation" data-tag="">
|
|
20
|
-
<a class="dropdown-item rounded-1 d-flex align-items-center gap-2" role="menuitem" href="#">
|
|
21
|
-
<span class="flex-grow-1">[[tags:all-tags]]</span>
|
|
22
|
-
<i component="tag/select/icon" class="flex-shrink-0 fa fa-fw fa-check {{{if selectedTag }}}invisible{{{ end }}}"></i>
|
|
23
|
-
</a>
|
|
24
|
-
</li>
|
|
25
|
-
{{{ each tagItems }}}
|
|
26
|
-
<li role="presentation" data-tag="{./valueEscaped}">
|
|
27
|
-
<a class="dropdown-item rounded-1 d-flex align-items-center gap-2" role="menuitem" href="#">
|
|
28
|
-
<span component="tag-markup" class="flex-grow-1">
|
|
29
|
-
<div class="d-inline-flex align-items-center gap-1">
|
|
30
|
-
{./valueEscaped}
|
|
31
|
-
</div>
|
|
32
|
-
</span>
|
|
33
|
-
<i component="tag/select/icon" class="flex-shrink-0 fa fa-fw fa-check {{{ if !./selected }}}invisible{{{ end }}}"></i>
|
|
34
|
-
</a>
|
|
35
|
-
</li>
|
|
36
|
-
{{{ end }}}
|
|
37
|
-
</ul>
|
|
38
|
-
</div>
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
{{{ if config.loggedIn }}}
|
|
2
|
-
<div class="btn-group bottom-sheet" component="tag/watch">
|
|
3
|
-
<button class="btn-ghost-sm ff-secondary d-flex gap-2 dropdown-toggle" data-bs-toggle="dropdown" type="button" aria-haspopup="true" aria-expanded="false">
|
|
4
|
-
<span component="tag/following/menu" class="d-flex gap-2 align-items-center{{{ if !isFollowing }}} hidden{{{ end }}}">
|
|
5
|
-
<i class="flex-shrink-0 fa fa-fw fa-bell-o text-primary"></i>
|
|
6
|
-
<span class="d-none d-md-inline fw-semibold">[[tags:watching]]</span>
|
|
7
|
-
</span>
|
|
8
|
-
|
|
9
|
-
<span component="tag/not-following/menu" class="d-flex gap-2 align-items-center{{{ if isFollowing}}} hidden{{{ end }}}">
|
|
10
|
-
<i class="flex-shrink-0 fa fa-fw fa-bell-slash-o text-primary"></i>
|
|
11
|
-
<span class="d-none d-md-inline fw-semibold">[[tags:not-watching]]</span>
|
|
12
|
-
</span>
|
|
13
|
-
</button>
|
|
14
|
-
<ul class="dropdown-menu p-1 text-sm" role="menu">
|
|
15
|
-
<li>
|
|
16
|
-
<a class="dropdown-item rounded-1 d-flex align-items-center gap-2 p-2" href="#" component="tag/following" role="menuitem">
|
|
17
|
-
<div class="flex-grow-1 d-flex flex-column">
|
|
18
|
-
<span class="d-flex align-items-center gap-2">
|
|
19
|
-
<i class="flex-shrink-0 fa fa-fw fa-bell-o"></i>
|
|
20
|
-
<span class="flex-grow-1 fw-semibold">[[tags:watching]]</span>
|
|
21
|
-
</span>
|
|
22
|
-
<div class="help-text text-muted text-xs">[[tags:watching.description]]</div>
|
|
23
|
-
</div>
|
|
24
|
-
<span class="flex-shrink-0"><i component="tag/following/check" class="fa fa-fw {{{ if isFollowing }}}fa-check{{{ end }}}"></i></span>
|
|
25
|
-
</a>
|
|
26
|
-
</li>
|
|
27
|
-
|
|
28
|
-
<li>
|
|
29
|
-
<a class="dropdown-item rounded-1 d-flex align-items-center gap-2 p-2" href="#" component="tag/not-following" role="menuitem">
|
|
30
|
-
<div class="flex-grow-1 d-flex flex-column">
|
|
31
|
-
<span class="d-flex align-items-center gap-2">
|
|
32
|
-
<i class="flex-shrink-0 fa fa-fw fa-bell-slash-o"></i>
|
|
33
|
-
<span class="flex-grow-1 fw-semibold">[[tags:not-watching]]</span>
|
|
34
|
-
</span>
|
|
35
|
-
<div class="help-text text-muted text-xs">[[tags:not-watching.description]]</div>
|
|
36
|
-
</div>
|
|
37
|
-
<span class="flex-shrink-0"><i component="tag/not-following/check" class="fa fa-fw {{{ if !isFollowing }}}fa-check{{{ end }}}"></i></span>
|
|
38
|
-
</a>
|
|
39
|
-
</li>
|
|
40
|
-
</ul>
|
|
41
|
-
</div>
|
|
42
|
-
{{{ end }}}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
<button type="button" class="btn-ghost-sm ff-secondary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
2
|
-
{{{ if selectedUser }}}
|
|
3
|
-
<span class="fw-semibold">{buildAvatar(selectedUser, "20px", true, "not-responsive")} {selectedUser.username}</span>
|
|
4
|
-
{{{ else }}}
|
|
5
|
-
<span class="fw-semibold">[[users:all-users]]</span>
|
|
6
|
-
{{{ end }}} <span class="caret text-primary opacity-75"></span>
|
|
7
|
-
</button>
|
|
8
|
-
<ul class="dropdown-menu p-1 text-sm" role="menu">
|
|
9
|
-
<li role="presentation" class="user {{{ if !selectedUser}}}selected{{{end}}}">
|
|
10
|
-
<a class="dropdown-item rounded-1 d-flex align-items-center gap-2" role="menuitem" href="{config.relative_path}/{allUsersUrl}">
|
|
11
|
-
<div class="flex-grow-1">[[users:all-users]]</div>
|
|
12
|
-
<i class="flex-shrink-0 fa fa-fw {{{ if !selectedUser }}}fa-check{{{ end }}}"></i>
|
|
13
|
-
</a>
|
|
14
|
-
</li>
|
|
15
|
-
{{{ each users }}}
|
|
16
|
-
<li role="presentation" class="user {{{ if ./selected}}}selected{{{end}}}">
|
|
17
|
-
<a class="dropdown-item rounded-1 d-flex align-items-center gap-2" role="menuitem" href="{config.relative_path}/{./url}">
|
|
18
|
-
<div class="flex-grow-1 d-inline-flex gap-1 align-items-center">{buildAvatar(@value, "24px", true, "not-responsive")} {./username}</div>
|
|
19
|
-
<i class="flex-shrink-0 fa fa-fw {{{ if ./selected }}}fa-check{{{ end }}}"></i>
|
|
20
|
-
</a>
|
|
21
|
-
</li>
|
|
22
|
-
{{{end}}}
|
|
23
|
-
</ul>
|
package/templates/register.tpl
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
<div data-widget-area="header">
|
|
2
|
-
{{{each widgets.header}}}
|
|
3
|
-
{{widgets.header.html}}
|
|
4
|
-
{{{end}}}
|
|
5
|
-
</div>
|
|
6
|
-
<div class="row register flex-fill">
|
|
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:register]]</h2>
|
|
9
|
-
<div class="row justify-content-center gap-5">
|
|
10
|
-
|
|
11
|
-
<div class="col-12 col-md-5 col-lg-3 px-md-0">
|
|
12
|
-
<div class="register-block">
|
|
13
|
-
<form component="register/local" class="d-flex flex-column gap-3" role="form" action="{config.relative_path}/register" method="post">
|
|
14
|
-
<div class="mb-2 d-flex flex-column gap-2">
|
|
15
|
-
<label for="username">[[register:username]]</label>
|
|
16
|
-
<div class="d-flex flex-column">
|
|
17
|
-
<input class="form-control" type="text" placeholder="[[register:username-placeholder]]" name="username" id="username" autocorrect="off" autocapitalize="off" autocomplete="nickname" aria-required="true" aria-describedby="username-notify"/>
|
|
18
|
-
<span class="register-feedback text-xs text-danger" id="username-notify" aria-live="polite"></span>
|
|
19
|
-
<span class="form-text text-xs">[[register:help.username-restrictions, {minimumUsernameLength}, {maximumUsernameLength}]]</span>
|
|
20
|
-
</div>
|
|
21
|
-
</div>
|
|
22
|
-
|
|
23
|
-
<div class="mb-2 d-flex flex-column gap-2">
|
|
24
|
-
<label for="password">[[register:password]]</label>
|
|
25
|
-
<div class="d-flex flex-column">
|
|
26
|
-
<input class="form-control" type="password" placeholder="[[register:password-placeholder]]" name="password" id="password" autocomplete="new-password" autocapitalize="off" aria-required="true" aria-describedby="password-notify"/>
|
|
27
|
-
<span class="register-feedback text-xs text-danger" id="password-notify" aria-live="polite"></span>
|
|
28
|
-
<span class="form-text text-xs">[[register:help.minimum-password-length, {minimumPasswordLength}]]</span>
|
|
29
|
-
<p id="caps-lock-warning" class="text-danger hidden">
|
|
30
|
-
<i class="fa fa-exclamation-triangle"></i> [[login:caps-lock-enabled]]
|
|
31
|
-
</p>
|
|
32
|
-
</div>
|
|
33
|
-
</div>
|
|
34
|
-
|
|
35
|
-
<div class="mb-2 d-flex flex-column gap-2">
|
|
36
|
-
<label for="password-confirm">[[register:confirm-password]]</label>
|
|
37
|
-
<div>
|
|
38
|
-
<input class="form-control" type="password" placeholder="[[register:confirm-password-placeholder]]" name="password-confirm" id="password-confirm" autocomplete="new-password" autocapitalize="off" aria-required="true" aria-describedby="password-confirm-notify"/>
|
|
39
|
-
<span class="register-feedback text-xs text-danger" id="password-confirm-notify" aria-live="polite"></span>
|
|
40
|
-
</div>
|
|
41
|
-
</div>
|
|
42
|
-
|
|
43
|
-
{{{ each regFormEntry }}}
|
|
44
|
-
<div class="mb-2 regFormEntry d-flex flex-column gap-2 {./styleName}">
|
|
45
|
-
<label for="{./inputId}">{./label}</label>
|
|
46
|
-
<div>{{./html}}</div>
|
|
47
|
-
</div>
|
|
48
|
-
{{{ end }}}
|
|
49
|
-
|
|
50
|
-
<button class="btn btn-primary" id="register" type="submit">[[register:register-now-button]]</button>
|
|
51
|
-
|
|
52
|
-
<div class="alert alert-danger{{{ if !error }}} hidden{{{ end }}}" id="register-error-notify" role="alert" aria-atomic="true">
|
|
53
|
-
<strong>[[error:registration-error]]</strong>
|
|
54
|
-
<p class="mb-0">{error}</p>
|
|
55
|
-
</div>
|
|
56
|
-
|
|
57
|
-
<hr/>
|
|
58
|
-
|
|
59
|
-
<span class="text-sm">[[register:already-have-account]]</span>
|
|
60
|
-
<a class="btn btn-outline-light text-body" href="{config.relative_path}/login">[[global:login]]</a>
|
|
61
|
-
|
|
62
|
-
<input id="token" type="hidden" name="token" value="" />
|
|
63
|
-
<input id="noscript" type="hidden" name="noscript" value="true" />
|
|
64
|
-
<input type="hidden" name="_csrf" value="{config.csrf_token}" />
|
|
65
|
-
</form>
|
|
66
|
-
</div>
|
|
67
|
-
</div>
|
|
68
|
-
|
|
69
|
-
{{{ if alternate_logins }}}
|
|
70
|
-
<div class="col-12 col-md-5 col-lg-3 px-md-0">
|
|
71
|
-
<div class="alt-register-block d-flex flex-column gap-2">
|
|
72
|
-
<label>[[register:alternative-registration]]</label>
|
|
73
|
-
<ul class="alt-logins list-unstyled">
|
|
74
|
-
{{{ each authentication }}}
|
|
75
|
-
<li class="{./name} mb-2">
|
|
76
|
-
<a class="btn btn-outline-light d-flex align-items-center" rel="nofollow noopener noreferrer" target="_top" href="{config.relative_path}{./url}">
|
|
77
|
-
{{{ if ./icons.svg }}}
|
|
78
|
-
{./icons.svg}
|
|
79
|
-
{{{ else }}}
|
|
80
|
-
<i class="flex-shrink-0 {./icons.normal}" style="color:{./color};"></i>
|
|
81
|
-
{{{ end }}}
|
|
82
|
-
{{{ if ./labels.register }}}
|
|
83
|
-
<div class="flex-grow-1 text-body text-sm">{./labels.register}</div>
|
|
84
|
-
{{{ end }}}
|
|
85
|
-
</a>
|
|
86
|
-
</li>
|
|
87
|
-
{{{ end }}}
|
|
88
|
-
</ul>
|
|
89
|
-
</div>
|
|
90
|
-
</div>
|
|
91
|
-
{{{ end }}}
|
|
92
|
-
</div>
|
|
93
|
-
</div>
|
|
94
|
-
<div data-widget-area="sidebar" class="col-lg-3 col-sm-12 {{{ if !widgets.sidebar.length }}}hidden{{{ end }}}">
|
|
95
|
-
{{{each widgets.sidebar}}}
|
|
96
|
-
{{widgets.sidebar.html}}
|
|
97
|
-
{{{end}}}
|
|
98
|
-
</div>
|
|
99
|
-
</div>
|
|
100
|
-
<div data-widget-area="footer">
|
|
101
|
-
{{{each widgets.footer}}}
|
|
102
|
-
{{widgets.footer.html}}
|
|
103
|
-
{{{end}}}
|
|
104
|
-
</div>
|