nodebb-theme-harmony 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/.eslintrc +3 -0
  2. package/README.md +8 -0
  3. package/lib/controllers.js +7 -0
  4. package/library.js +51 -0
  5. package/package.json +45 -0
  6. package/plugin.json +11 -0
  7. package/public/.eslintrc +3 -0
  8. package/public/admin.js +15 -0
  9. package/renovate.json +6 -0
  10. package/scss/harmony.scss +3 -0
  11. package/scss/overrides.scss +1 -0
  12. package/templates/account/best.tpl +3 -0
  13. package/templates/account/blocks.tpl +35 -0
  14. package/templates/account/bookmarks.tpl +3 -0
  15. package/templates/account/categories.tpl +30 -0
  16. package/templates/account/consent.tpl +71 -0
  17. package/templates/account/controversial.tpl +3 -0
  18. package/templates/account/downvoted.tpl +3 -0
  19. package/templates/account/edit/password.tpl +32 -0
  20. package/templates/account/edit/username.tpl +28 -0
  21. package/templates/account/edit.tpl +137 -0
  22. package/templates/account/followers.tpl +19 -0
  23. package/templates/account/following.tpl +19 -0
  24. package/templates/account/groups.tpl +19 -0
  25. package/templates/account/ignored.tpl +3 -0
  26. package/templates/account/info.tpl +228 -0
  27. package/templates/account/posts.tpl +21 -0
  28. package/templates/account/profile.tpl +168 -0
  29. package/templates/account/sessions.tpl +34 -0
  30. package/templates/account/settings.tpl +231 -0
  31. package/templates/account/theme.tpl +29 -0
  32. package/templates/account/topics.tpl +32 -0
  33. package/templates/account/uploads.tpl +45 -0
  34. package/templates/account/upvoted.tpl +3 -0
  35. package/templates/account/watched.tpl +3 -0
  36. package/templates/admin/plugins/persona.tpl +29 -0
  37. package/templates/categories.tpl +33 -0
  38. package/templates/category.tpl +65 -0
  39. package/templates/chat.tpl +41 -0
  40. package/templates/chats.tpl +21 -0
  41. package/templates/flags/detail.tpl +211 -0
  42. package/templates/flags/list.tpl +73 -0
  43. package/templates/footer.tpl +16 -0
  44. package/templates/groups/details.tpl +79 -0
  45. package/templates/groups/list.tpl +50 -0
  46. package/templates/groups/members.tpl +8 -0
  47. package/templates/header.tpl +49 -0
  48. package/templates/login.tpl +98 -0
  49. package/templates/modules/taskbar.tpl +5 -0
  50. package/templates/modules/usercard.tpl +39 -0
  51. package/templates/notifications.tpl +68 -0
  52. package/templates/partials/acceptTos.tpl +11 -0
  53. package/templates/partials/account/category-item.tpl +25 -0
  54. package/templates/partials/account/header.tpl +48 -0
  55. package/templates/partials/account/menu.tpl +103 -0
  56. package/templates/partials/breadcrumbs.tpl +20 -0
  57. package/templates/partials/buttons/newTopic.tpl +24 -0
  58. package/templates/partials/categories/item.tpl +62 -0
  59. package/templates/partials/categories/lastpost.tpl +28 -0
  60. package/templates/partials/categories/link.tpl +13 -0
  61. package/templates/partials/category/sort.tpl +17 -0
  62. package/templates/partials/category/subcategory.tpl +20 -0
  63. package/templates/partials/category/tags.tpl +5 -0
  64. package/templates/partials/category/tools.tpl +83 -0
  65. package/templates/partials/category/watch.tpl +23 -0
  66. package/templates/partials/category-filter-content.tpl +31 -0
  67. package/templates/partials/category-filter-right.tpl +5 -0
  68. package/templates/partials/category-filter.tpl +5 -0
  69. package/templates/partials/category-selector-content.tpl +35 -0
  70. package/templates/partials/category-selector-right.tpl +5 -0
  71. package/templates/partials/category-selector.tpl +5 -0
  72. package/templates/partials/chats/dropdown.tpl +40 -0
  73. package/templates/partials/chats/message-window.tpl +36 -0
  74. package/templates/partials/chats/message.tpl +36 -0
  75. package/templates/partials/chats/messages.tpl +9 -0
  76. package/templates/partials/chats/options.tpl +26 -0
  77. package/templates/partials/chats/recent_room.tpl +33 -0
  78. package/templates/partials/chats/system-message.tpl +5 -0
  79. package/templates/partials/chats/user.tpl +3 -0
  80. package/templates/partials/chats-menu.tpl +43 -0
  81. package/templates/partials/cookie-consent.tpl +6 -0
  82. package/templates/partials/flags/filters.tpl +99 -0
  83. package/templates/partials/groups/admin.tpl +197 -0
  84. package/templates/partials/groups/badge.tpl +3 -0
  85. package/templates/partials/groups/list.tpl +23 -0
  86. package/templates/partials/groups/memberlist.tpl +43 -0
  87. package/templates/partials/header/user-menu.tpl +87 -0
  88. package/templates/partials/menu.tpl +188 -0
  89. package/templates/partials/notifications_list.tpl +32 -0
  90. package/templates/partials/paginator.tpl +47 -0
  91. package/templates/partials/post_bar.tpl +22 -0
  92. package/templates/partials/posts_list.tpl +10 -0
  93. package/templates/partials/posts_list_item.tpl +34 -0
  94. package/templates/partials/quick-search-results.tpl +36 -0
  95. package/templates/partials/search-results.tpl +57 -0
  96. package/templates/partials/slideout-menu.tpl +6 -0
  97. package/templates/partials/tags_list.tpl +7 -0
  98. package/templates/partials/thread_tools.tpl +10 -0
  99. package/templates/partials/toast.tpl +16 -0
  100. package/templates/partials/topic/browsing-users.tpl +3 -0
  101. package/templates/partials/topic/event.tpl +28 -0
  102. package/templates/partials/topic/navigation-post.tpl +14 -0
  103. package/templates/partials/topic/navigator.tpl +41 -0
  104. package/templates/partials/topic/necro-post.tpl +5 -0
  105. package/templates/partials/topic/post-editor.tpl +3 -0
  106. package/templates/partials/topic/post-menu-list.tpl +134 -0
  107. package/templates/partials/topic/post-menu.tpl +6 -0
  108. package/templates/partials/topic/post.tpl +116 -0
  109. package/templates/partials/topic/quickreply.tpl +30 -0
  110. package/templates/partials/topic/reactions.tpl +3 -0
  111. package/templates/partials/topic/reply-button.tpl +29 -0
  112. package/templates/partials/topic/selection-tooltip.tpl +5 -0
  113. package/templates/partials/topic/sort.tpl +11 -0
  114. package/templates/partials/topic/stats.tpl +14 -0
  115. package/templates/partials/topic/tag.tpl +3 -0
  116. package/templates/partials/topic/tags.tpl +5 -0
  117. package/templates/partials/topic/topic-menu-list.tpl +34 -0
  118. package/templates/partials/topic/watch.tpl +24 -0
  119. package/templates/partials/topic-filters.tpl +14 -0
  120. package/templates/partials/topic-terms.tpl +14 -0
  121. package/templates/partials/topics_list.tpl +118 -0
  122. package/templates/partials/users_list.tpl +60 -0
  123. package/templates/partials/users_list_menu.tpl +23 -0
  124. package/templates/popular.tpl +37 -0
  125. package/templates/recent.tpl +39 -0
  126. package/templates/register.tpl +89 -0
  127. package/templates/search.tpl +185 -0
  128. package/templates/tag.tpl +35 -0
  129. package/templates/tags.tpl +34 -0
  130. package/templates/top.tpl +37 -0
  131. package/templates/topic.tpl +108 -0
  132. package/templates/unread.tpl +39 -0
  133. package/templates/users.tpl +36 -0
  134. package/theme.json +7 -0
  135. package/theme.scss +1 -0
@@ -0,0 +1,211 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <!-- IMPORT partials/breadcrumbs.tpl -->
4
+
5
+ <div class="row">
6
+ <div class="col-12">
7
+ <h2 class="h4">
8
+ {target_readable}
9
+ <small><span class="text-muted timeago" title="{datetimeISO}"></span></small>
10
+ </h2>
11
+
12
+ <hr />
13
+
14
+ <!-- IF type_bool.post -->
15
+ <div class="d-flex">
16
+ <div class="flex-shrink-0">
17
+ <a href="{config.relative_path}/user/{target.user.userslug}">{buildAvatar(target.user, "64px", true, "media-object")}</a>
18
+ </div>
19
+ <div class="flex-grow-1 ms-3">
20
+ <h4 class="media-heading"><a href="{config.relative_path}/user/{target.user.userslug}">{target.user.username}</a></h4>
21
+ {target.content}
22
+ </div>
23
+ </div>
24
+ <!-- ENDIF type_bool.post -->
25
+
26
+ <!-- IF type_bool.user -->
27
+ <div class="d-flex">
28
+ <div class="flex-shrink-0">
29
+ <a href="{config.relative_path}/user/{target.userslug}">{buildAvatar(target, "64px", true, "media-object")}</a>
30
+ </div>
31
+ <div class="flex-grow-1 ms-3">
32
+ <h4 class="media-heading"><a href="{config.relative_path}/user/{target.userslug}">{target.username}</a></h4>
33
+ <p class="lead">
34
+ <a href="{config.relative_path}/uid/{target.uid}">[[flags:user-view]]</a> |
35
+ <a href="{config.relative_path}/uid/{target.uid}/edit">[[flags:user-edit]]</a>
36
+ </p>
37
+ </div>
38
+ </div>
39
+ <!-- ENDIF type_bool.user -->
40
+
41
+ <!-- IF type_bool.empty -->
42
+ <div class="alert alert-warning" role="alert">[[flags:target-purged]]</div>
43
+ <!-- ENDIF type_bool.empty -->
44
+
45
+ <hr />
46
+
47
+ <div class="row">
48
+ <div class="col-sm-6">
49
+ <form role="form" id="attributes">
50
+ <div class="mb-3">
51
+ <h2 class="h4">[[flags:reports]]</h2>
52
+ <ul class="list-group" component="flag/reports">
53
+ {{{ each reports }}}
54
+ <li class="list-group-item">
55
+ <a href="{config.relative_path}/user/{./reporter.userslug}">{buildAvatar(./reporter, "24px", true)}</a>
56
+ &ndash; <span class="timeago" title="{./timestampISO}"></span>
57
+ <blockquote><em>{./value}</em></blockquote>
58
+ </li>
59
+ {{{ end }}}
60
+ </ul>
61
+ </div>
62
+ <div class="mb-3">
63
+ <h2 class="h4" for="state">[[flags:state]]</h2>
64
+ <select class="form-select" id="state" name="state" disabled>
65
+ <option value="open">[[flags:state-open]]</option>
66
+ <option value="wip">[[flags:state-wip]]</option>
67
+ <option value="resolved">[[flags:state-resolved]]</option>
68
+ <option value="rejected">[[flags:state-rejected]]</option>
69
+ </select>
70
+ </div>
71
+ <div class="mb-3">
72
+ <h2 class="h4" for="assignee">[[flags:assignee]]</h2>
73
+ <select class="form-control" id="assignee" name="assignee" disabled>
74
+ <option value="">[[flags:no-assignee]]</option>
75
+ {{{each assignees}}}
76
+ <option value="{../uid}">{../username}</option>
77
+ {{{end}}}
78
+ </select>
79
+ </div>
80
+ <div class="d-grid">
81
+ <button type="button" class="btn btn-primary" data-action="update">[[flags:update]]</button>
82
+ </div>
83
+ </form>
84
+
85
+ <hr />
86
+
87
+ <form role="form">
88
+ <div class="mb-3">
89
+ <h2 class="h4" for="note">[[flags:notes]]</h2>
90
+ <textarea id="note" class="form-control"></textarea>
91
+ <div class="d-grid">
92
+ <button type="button" class="btn btn-block btn-primary" data-action="appendNote">[[flags:add-note]]</button>
93
+ </div>
94
+ </div>
95
+ </form>
96
+
97
+ <div component="flag/notes">
98
+ <!-- IF !notes.length -->
99
+ <div class="alert alert-success text-center">[[flags:no-notes]]</div>
100
+ <!-- ENDIF !notes.length -->
101
+ {{{each notes}}}
102
+ <div class="d-flex mb-3">
103
+ <div class="flex-shrink-0">
104
+ <a href="{config.relative_path}/user/{../user.userslug}">{buildAvatar(notes.user, "32px", true, "media-object")}</a>
105
+ </div>
106
+ <div class="flex-grow-1 mx-3">
107
+ <h2 class="h5">
108
+ <a href="{config.relative_path}/user/{../user.userslug}">{../user.username}</a>
109
+ <small><span class="timeago" title="{../datetimeISO}"></span></small>
110
+ </h4>
111
+ {../content}
112
+ </div>
113
+ <div class="flex-shrink-0">
114
+ <a href="#" class="btn btn-sm btn-link" data-action="prepare-edit"><i class="fa fa-pencil"></i></a>
115
+ <a href="#" class="btn btn-sm btn-link" data-action="delete-note"><i class="fa fa-trash text-danger"></i></a>
116
+ </div>
117
+ </div>
118
+ {{{end}}}
119
+ </div>
120
+ </div>
121
+ <div class="col-sm-6">
122
+ <h2 class="h4">[[flags:quick-actions]]</h2>
123
+
124
+ <div class="d-grid gap-1">
125
+ <a class="btn btn-light" href="{config.relative_path}/{type_path}/{targetId}">
126
+ <i class="fa fa-external-link"></i>
127
+ [[flags:go-to-target]]
128
+ </a>
129
+
130
+ <a class="btn btn-light" href="#" data-action="assign">
131
+ <i class="fa fa-id-card-o"></i>
132
+ [[flags:assign-to-me]]
133
+ </a>
134
+
135
+ {{{ if type_bool.post }}}
136
+ {{{ if !target.deleted}}}
137
+ <a class="btn btn-outline-danger" href="#" data-action="delete-post"><i class="fa fa-trash"></i> [[flags:delete-post]]</a>
138
+ {{{ else }}}
139
+ <a class="btn btn-danger" href="#" data-action="purge-post"><i class="fa fa-trash"></i> [[flags:purge-post]]</a>
140
+ <a class="btn btn-outline-success" href="#" data-action="restore-post"><i class="fa fa-reply"></i><i class="fa fa-trash"></i> [[flags:restore-post]]</a>
141
+ {{{ end }}}
142
+ {{{ end }}}
143
+
144
+ {{{ if target.uid }}}
145
+ <div class="btn-group" data-uid="{target.uid}">
146
+ <button type="button" class="btn btn-light dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
147
+ <i class="fa fa-street-view"></i>
148
+ [[flags:flagged-user]]
149
+ <span class="caret"></span>
150
+ </button>
151
+ <ul class="dropdown-menu">
152
+ <li><a class="dropdown-item" href="{config.relative_path}/uid/{target.uid}">[[flags:view-profile]]</a></li>
153
+ {{{ if !config.disableChat }}}
154
+ <li><a class="dropdown-item" href="#" data-action="chat">[[flags:start-new-chat]]</a></li>
155
+ {{{ end }}}
156
+ <li class="dropdown-divider"></li>
157
+ {{{ if privileges.ban }}}
158
+ <li class="{{{ if target.user.banned }}}hidden{{{ end }}}"><a class="dropdown-item" href="#" data-action="ban">[[user:ban_account]]</a></li>
159
+ <li class="{{{ if !target.user.banned }}}hidden{{{ end }}}"><a class="dropdown-item" href="#" data-action="unban">[[user:unban_account]]</a></li>
160
+ {{{ end }}}
161
+ {{{ if privileges.mute}}}
162
+ <li class="{{{ if target.user.muted }}}hidden{{{ end }}}"><a class="dropdown-item" href="#" data-action="mute">[[user:mute_account]]</a></li>
163
+ <li class="{{{ if !target.user.muted }}}hidden{{{ end }}}"><a class="dropdown-item" href="#" data-action="unmute">[[user:unmute_account]]</a></li>
164
+ {{{ end }}}
165
+ {{{ if privileges.admin:users }}}
166
+ <li><a class="dropdown-item" href="#" data-action="delete-account">[[user:delete_account_as_admin]]</a></li>
167
+ <li><a class="dropdown-item" href="#" data-action="delete-content">[[user:delete_content]]</a></li>
168
+ <li><a class="dropdown-item" href="#" data-action="delete-all">[[user:delete_all]]</a></li>
169
+ {{{ end }}}
170
+ </ul>
171
+ </div>
172
+ {{{ end }}}
173
+ </div>
174
+
175
+ <hr />
176
+
177
+ <h2 class="h4">[[flags:history]]</h2>
178
+ <div component="flag/history">
179
+ <!-- IF !history.length -->
180
+ <div class="alert alert-success text-center">[[flags:no-history]]</div>
181
+ <!-- ENDIF !history.length -->
182
+ {{{each history}}}
183
+ <div class="d-flex">
184
+ <div class="flex-shrink-0">
185
+ <a href="{config.relative_path}/user/{../user.userslug}">{buildAvatar(history.user, "32px", true, "media-object")}</a>
186
+ </div>
187
+ <div class="flex-grow-1 ms-3">
188
+ <h4 class="media-heading">
189
+ <a href="{config.relative_path}/user/{../user.userslug}">{../user.username}</a>
190
+ <small><span class="timeago" title="{../datetimeISO}"></span></small>
191
+ </h4>
192
+ <ul>
193
+ {{{each ./fields}}}
194
+ <li>
195
+ <span class="badge bg-primary">[[flags:{@key}]]</span><!-- IF @value --> &rarr; <span class="badge bg-light text-dark">{@value}</span><!-- ENDIF @value -->
196
+ </li>
197
+ {{{end}}}
198
+ {{{ each ./meta }}}
199
+ <li>
200
+ <span class="badge bg-{{./labelClass}}">{{./key}}</span>{{{ if ./value }}} &rarr; <span class="badge bg-light text-dark">{{ ./value }}</span>{{{ end }}}
201
+ </li>
202
+ {{{ end }}}
203
+ </ul>
204
+ </div>
205
+ </div>
206
+ {{{end}}}
207
+ </div>
208
+ </div>
209
+ </div>
210
+ </div>
211
+ </div>
@@ -0,0 +1,73 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <!-- IMPORT partials/breadcrumbs.tpl -->
4
+
5
+ <div class="row">
6
+ <div class="col-sm-4 col-md-3">
7
+ <!-- IMPORT partials/flags/filters.tpl -->
8
+ </div>
9
+ <div class="col-sm-8 col-md-9">
10
+ <!-- IF hasFilter -->
11
+ <div class="alert alert-warning">
12
+ <p class="float-end">
13
+ <a href="{config.relative_path}/flags">[[flags:filter-reset]]</a>
14
+ </p>
15
+ [[flags:filter-active]]
16
+ </div>
17
+ <!-- ENDIF hasFilter -->
18
+
19
+ <div class="btn-group float-end" component="flags/bulk-actions">
20
+ <button type="button" class="btn btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown" autocomplete="off" aria-haspopup="true" aria-expanded="false" disabled="disabled">
21
+ <i class="fa fa-clone"></i> [[flags:bulk-actions]] <span class="caret"></span>
22
+ </button>
23
+ <ul class="dropdown-menu">
24
+ <li><a href="#" class="dropdown-item" data-action="bulk-assign">[[flags:assign-to-me]]</a></li>
25
+ <li><a href="#" class="dropdown-item" data-action="bulk-mark-resolved">[[flags:bulk-resolve]]</a></li>
26
+ </ul>
27
+ </div>
28
+
29
+ <table class="table table-striped table-hover" component="flags/list">
30
+ <thead>
31
+ <tr>
32
+ <th>
33
+ <input type="checkbox" data-action="toggle-all" autocomplete="off" />
34
+ </th>
35
+ <th></th>
36
+ <th><span class="hidden-xs">[[flags:reports]] </span><i class="fa fa-user-plus"></i></th>
37
+ <th><span class="hidden-xs">[[flags:first-reported]] </span><i class="fa fa-clock-o"></i></th>
38
+ <th>[[flags:state]]</th>
39
+ </tr>
40
+ </thead>
41
+ <tbody>
42
+ <!-- IF !flags.length -->
43
+ <tr>
44
+ <td colspan="5">
45
+ <div class="alert alert-success text-center">
46
+ [[flags:no-flags]]
47
+ </div>
48
+ </td>
49
+ </tr>
50
+ <!-- ENDIF !flags.length -->
51
+ {{{each flags}}}
52
+ <tr data-flag-id="{../flagId}">
53
+ <td>
54
+ <input type="checkbox" autocomplete="off" />
55
+ </td>
56
+ <td>
57
+ <a href="{config.relative_path}/flags/{../flagId}">
58
+ <strong>{../target_readable}</strong>
59
+ </a>
60
+ </td>
61
+ <td>
62
+ {./heat}
63
+ </td>
64
+ <td><span class="timeago" title="{../datetimeISO}"></span></td>
65
+ <td><span class="badge bg-{../labelClass}">[[flags:state-{../state}]]</span></td>
66
+ </tr>
67
+ {{{end}}}
68
+ </tbody>
69
+ </table>
70
+
71
+ <!-- IMPORT partials/paginator.tpl -->
72
+ </div>
73
+ </div>
@@ -0,0 +1,16 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ </div><!-- /.container#content -->
4
+ </main>
5
+ {{{ if !isSpider }}}
6
+ <div component="toaster/tray" class="alert-window">
7
+ <div id="reconnect-alert" class="alert alert-dismissible alert-warning clearfix hide" component="toaster/toast">
8
+ <button type="button" class="btn-close float-end" data-bs-dismiss="alert" aria-hidden="true"></button>
9
+ <p>[[global:reconnecting-message, {config.siteTitle}]]</p>
10
+ </div>
11
+ </div>
12
+ {{{ end }}}
13
+
14
+ <!-- IMPORT partials/footer/js.tpl -->
15
+ </body>
16
+ </html>
@@ -0,0 +1,79 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <div component="groups/container" class="groups details row">
4
+ <div component="groups/cover" style="background-image: url({group.cover:url}); background-position: {group.cover:position};">
5
+ <!-- IF group.isOwner -->
6
+ <div class="controls">
7
+ <span class="upload"><i class="fa fa-fw fa-4x fa-upload"></i></span>
8
+ <span class="resize"><i class="fa fa-fw fa-4x fa-arrows"></i></span>
9
+ <span class="remove"><i class="fa fa-fw fa-4x fa-times"></i></span>
10
+ </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
+ </div>
15
+
16
+ <div class="col-12">
17
+ <!-- IMPORT partials/breadcrumbs.tpl -->
18
+ </div>
19
+
20
+ <div class="col-lg-4 col-12">
21
+ <div class="card mb-3">
22
+ <div class="card-header">
23
+ <span class="fs-5">
24
+ <i class="fa fa-list-ul"></i> [[groups:details.title]]
25
+ <!-- IF group.private --><span class="badge bg-info text-dark">[[groups:details.private]]</span><!-- ENDIF group.private -->
26
+ <!-- IF group.hidden --><span class="badge bg-info text-dark">[[groups:details.hidden]]</span>&nbsp;<!-- ENDIF group.hidden -->
27
+ </span>
28
+ </div>
29
+ <div class="card-body">
30
+ <h2>{group.displayName}</h2>
31
+ <p>{group.descriptionParsed}</p>
32
+ <!-- IF isAdmin -->
33
+ <div class="float-end">
34
+ <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>
35
+ </div>
36
+ <!-- ENDIF isAdmin -->
37
+ <!-- IF loggedIn -->
38
+ <div class="float-end">
39
+ {function.membershipBtn, group}&nbsp;
40
+ </div>
41
+ <!-- ENDIF loggedIn -->
42
+ </div>
43
+ </div>
44
+
45
+ <div class="card mb-3">
46
+ <div class="card-header">
47
+ <span class="fs-5">
48
+ <i class="fa fa-users"></i> [[groups:details.members]]
49
+ </span>
50
+ </div>
51
+ <div class="card-body">
52
+ <!-- IMPORT partials/groups/memberlist.tpl -->
53
+ </div>
54
+ </div>
55
+
56
+ <!-- IF group.isOwner -->
57
+ <!-- IMPORT partials/groups/admin.tpl -->
58
+ <!-- ENDIF group.isOwner -->
59
+
60
+ <div data-widget-area="left">
61
+ {{{each widgets.left}}}
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}}}
77
+ </div>
78
+ </div>
79
+ </div>
@@ -0,0 +1,50 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <!-- IMPORT partials/breadcrumbs.tpl -->
4
+ <div data-widget-area="header">
5
+ {{{each widgets.header}}}
6
+ {{widgets.header.html}}
7
+ {{{end}}}
8
+ </div>
9
+ <div class="groups list">
10
+ <div class="row justify-content-between">
11
+ <div class="col-lg-6">
12
+ <!-- IF allowGroupCreation -->
13
+ <button class="btn btn-primary" data-action="new"><i class="fa fa-plus"></i> [[groups:new_group]]</button>
14
+ <!-- ENDIF allowGroupCreation -->
15
+ </div>
16
+ <div class="col-lg-6">
17
+ <div class="row justify-content-end">
18
+ <div class="col-5 col-md-6">
19
+ <select class="form-select" id="search-sort">
20
+ <option value="alpha">[[groups:details.group_name]]</option>
21
+ <option value="count">[[groups:details.member_count]]</option>
22
+ <option value="date">[[groups:details.creation_date]]</option>
23
+ </select>
24
+ </div>
25
+ <div class="col-7 col-md-6">
26
+ <div class="input-group">
27
+ <input type="text" class="form-control" placeholder="[[global:search]]" name="query" value="" id="search-text">
28
+ <button id="search-button" class="btn btn-primary">
29
+ <i class="fa fa-search"></i>
30
+ </button>
31
+ </div>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ </div>
36
+
37
+ <hr />
38
+
39
+ <div component="groups/container" class="row" id="groups-list" data-nextstart={nextStart}>
40
+ <!-- IF groups.length -->
41
+ <!-- IMPORT partials/groups/list.tpl -->
42
+ <!-- ELSE -->
43
+ <div class="col-12">
44
+ <div class="alert alert-warning">
45
+ [[groups:no_groups_found]]
46
+ </div>
47
+ </div>
48
+ <!-- ENDIF groups.length -->
49
+ </div>
50
+ </div>
@@ -0,0 +1,8 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <!-- IMPORT partials/breadcrumbs.tpl -->
4
+ <div class="users">
5
+ <!-- IMPORT partials/users_list.tpl -->
6
+
7
+ <!-- IMPORT partials/paginator.tpl -->
8
+ </div>
@@ -0,0 +1,49 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <!DOCTYPE html>
4
+ <html lang="{function.localeToHTML, userLang, defaultLang}" {{{if languageDirection}}}data-dir="{languageDirection}" style="direction: {languageDirection};"{{{end}}}>
5
+ <head>
6
+ <title>{browserTitle}</title>
7
+ {{{each metaTags}}}{function.buildMetaTag}{{{end}}}
8
+ <link rel="stylesheet" type="text/css" href="{relative_path}/assets/client{{{if bootswatchSkin}}}-{bootswatchSkin}{{{end}}}{{{ if (languageDirection=="rtl") }}}-rtl{{{ end }}}.css?{config.cache-buster}" />
9
+ {{{each linkTags}}}{function.buildLinkTag}{{{end}}}
10
+
11
+ <script>
12
+ var config = JSON.parse('{{configJSON}}');
13
+ var app = {
14
+ user: JSON.parse('{{userJSON}}')
15
+ };
16
+
17
+ document.documentElement.style.setProperty('--panel-offset', `${localStorage.getItem('panelOffset') || 0}px`);
18
+ </script>
19
+
20
+ {{{if useCustomHTML}}}
21
+ {{customHTML}}
22
+ {{{end}}}
23
+ {{{if useCustomCSS}}}
24
+ <style>{{customCSS}}</style>
25
+ {{{end}}}
26
+ </head>
27
+
28
+ <body class="{bodyClass} skin-{{{if bootswatchSkin}}}{bootswatchSkin}{{{else}}}noskin{{{end}}}">
29
+ <nav id="menu" class="slideout-menu hidden">
30
+ <!-- IMPORT partials/slideout-menu.tpl -->
31
+ </nav>
32
+ <nav id="chats-menu" class="slideout-menu hidden">
33
+ <!-- IMPORT partials/chats-menu.tpl -->
34
+ </nav>
35
+
36
+ <main id="panel" class="slideout-panel">
37
+ <nav class="navbar sticky-top navbar-expand-lg bg-light header border-bottom" id="header-menu" component="navbar">
38
+ <div class="container justify-content-start flex-nowrap">
39
+ <!-- IMPORT partials/menu.tpl -->
40
+ </div>
41
+ </nav>
42
+ <script>
43
+ const rect = document.getElementById('header-menu').getBoundingClientRect();
44
+ const offset = Math.max(0, rect.bottom);
45
+ document.documentElement.style.setProperty('--panel-offset', offset + `px`);
46
+ </script>
47
+ <div class="container pt-3" id="content">
48
+ <!-- IMPORT partials/noscript/warning.tpl -->
49
+ <!-- IMPORT partials/noscript/message.tpl -->
@@ -0,0 +1,98 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <!-- IMPORT partials/breadcrumbs.tpl -->
4
+ <div data-widget-area="header">
5
+ {{{each widgets.header}}}
6
+ {{widgets.header.html}}
7
+ {{{end}}}
8
+ </div>
9
+ <div class="row login">
10
+ <div class="{{{ if widgets.sidebar.length }}}col-lg-9 col-sm-12{{{ else }}}col-lg-12{{{ end }}}">
11
+ <div class="row">
12
+ {{{ if allowLocalLogin }}}
13
+ <div class="{{{ if alternate_logins }}}col-md-6{{{ else }}}col-md-12{{{ end }}}">
14
+ <div class="login-block">
15
+ <div class="alert alert-danger alert-dismissible" id="login-error-notify" {{{ if error }}}style="display:block"{{{ else }}}style="display: none;"{{{ end }}}>
16
+ <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
17
+ <strong>[[login:failed_login_attempt]]</strong>
18
+ <p>{error}</p>
19
+ </div>
20
+
21
+ <form class="form-horizontal" role="form" method="post" id="login-form">
22
+ <div class="row mb-2">
23
+ <label for="username" class="col-lg-2 col-form-label">{allowLoginWith}</label>
24
+ <div class="col-lg-10">
25
+ <input class="form-control" type="text" placeholder="{allowLoginWith}" name="username" id="username" autocorrect="off" autocapitalize="off" value="{username}"/>
26
+ </div>
27
+ </div>
28
+ <div class="row mb-2">
29
+ <label for="password" class="col-lg-2 col-form-label">[[user:password]]</label>
30
+ <div class="col-lg-10">
31
+ <input class="form-control" type="password" placeholder="[[user:password]]" name="password" id="password" {{{ if username }}}autocomplete="off"{{{ end }}}/>
32
+ <p id="caps-lock-warning" class="text-danger hidden">
33
+ <i class="fa fa-exclamation-triangle"></i> [[login:caps-lock-enabled]]
34
+ </p>
35
+ </div>
36
+ </div>
37
+ <div class="row mb-2">
38
+ <div class="col-lg-10 offset-lg-2">
39
+ <div class="checkbox">
40
+ <label>
41
+ <input type="checkbox" name="remember" id="remember" checked /> [[login:remember_me]]
42
+ </label>
43
+ </div>
44
+ </div>
45
+ </div>
46
+ {{{each loginFormEntry}}}
47
+ <div class="row mb-2 loginFormEntry">
48
+ <label for="login-{loginFormEntry.styleName}" class="col-lg-2 col-form-label">{loginFormEntry.label}</label>
49
+ <div id="login-{loginFormEntry.styleName}" class="col-lg-10">{{loginFormEntry.html}}</div>
50
+ </div>
51
+ {{{end}}}
52
+ <input type="hidden" name="_csrf" value="{config.csrf_token}" />
53
+ <input type="hidden" name="noscript" id="noscript" value="true" />
54
+ <div class="row">
55
+ <div class="col-lg-10 offset-lg-2">
56
+ <button class="btn btn-primary btn-lg" id="login" type="submit">[[global:login]]</button>
57
+ </div>
58
+ </div>
59
+ <div class="row">
60
+ <div class="col-lg-10 offset-lg-2">
61
+ {{{ if allowRegistration }}}
62
+ <span>[[login:dont_have_account]] <a href="{config.relative_path}/register">[[register:register]]</a></span>
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>
69
+ </form>
70
+ </div>
71
+ </div>
72
+ {{{ end }}}
73
+
74
+ {{{ if alternate_logins }}}
75
+ <div class="{{{ if allowLocalLogin }}}col-md-6{{{ else }}}col-md-12{{{ end }}}">
76
+ <div class="alt-login-block">
77
+ <h4>[[login:alternative_logins]]</h4>
78
+ <ul class="alt-logins">
79
+ {{{each authentication}}}
80
+ <li class="{authentication.name}"><a rel="nofollow noopener noreferrer" target="_top" href="{config.relative_path}{authentication.url}"><i class="fa {authentication.icon} fa-3x"></i></a></li>
81
+ {{{end}}}
82
+ </ul>
83
+ </div>
84
+ </div>
85
+ {{{ end }}}
86
+ </div>
87
+ </div>
88
+ <div data-widget-area="sidebar" class="col-lg-3 col-sm-12 {{{ if !widgets.sidebar.length }}}hidden{{{ end }}}">
89
+ {{{each widgets.sidebar}}}
90
+ {{widgets.sidebar.html}}
91
+ {{{end}}}
92
+ </div>
93
+ </div>
94
+ <div data-widget-area="footer">
95
+ {{{each widgets.footer}}}
96
+ {{widgets.footer.html}}
97
+ {{{end}}}
98
+ </div>
@@ -0,0 +1,5 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <div id="taskbar" class="taskbar fixed-bottom">
4
+ <div class="navbar-inner"><ul class="nav navbar-nav"></ul></div>
5
+ </div>
@@ -0,0 +1,39 @@
1
+ <!-- THIS FILE IS STILL PERSONA -->
2
+
3
+ <div class="persona-usercard">
4
+ <a href="{config.relative_path}/user/{userslug}">
5
+ <!-- IF picture -->
6
+ <div class="usercard-picture" style="background-image:url({picture})"></div>
7
+ <!-- ELSE -->
8
+ <div class="usercard-picture" style="background-color: {icon:bgColor};">{icon:text}</div>
9
+ <!-- ENDIF picture -->
10
+ </a>
11
+ <div class="usercard-body">
12
+ <a href="{config.relative_path}/user/{userslug}">
13
+ <span class="usercard-name"><!-- IF fullname -->{fullname}<!-- ELSE -->{username}<!-- ENDIF fullname --></span><br />
14
+ <span class="usercard-username"><!-- IF !banned -->@{username}<!-- ELSE -->[[user:banned]]<!-- ENDIF !banned --></span>
15
+ <!-- IF !banned -->
16
+ <i component="user/status" class="fa fa-circle status {status}" title="[[global:{status}]]"></i>
17
+ <!-- ENDIF !banned -->
18
+ </a>
19
+
20
+ <div class="row usercard-info">
21
+ <div class="col-4">
22
+ <small>[[global:posts]]</small>
23
+ <span class="human-readable-number">{postcount}</span>
24
+ </div>
25
+ <div class="col-4">
26
+ <small>[[global:reputation]]</small>
27
+ <span class="human-readable-number">{reputation}</span>
28
+ </div>
29
+
30
+ <button class="btn-morph persona-fab <!-- IF banned --> hide<!-- ENDIF banned -->">
31
+ <span>
32
+ <span class="s1"></span>
33
+ <span class="s2"></span>
34
+ <span class="s3"></span>
35
+ </span>
36
+ </button>
37
+ </div>
38
+ </div>
39
+ </div>