nodebb-theme-persona 12.1.4 → 13.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.
Files changed (247) hide show
  1. package/README.md +14 -14
  2. package/package.json +2 -2
  3. package/public/persona.js +11 -23
  4. package/{less/account.less → scss/account.scss} +13 -97
  5. package/{less/categories.less → scss/categories.scss} +10 -40
  6. package/{less/category.less → scss/category.scss} +26 -75
  7. package/{less/chats.less → scss/chats.scss} +35 -88
  8. package/{less/flags.less → scss/flags.scss} +3 -3
  9. package/{less/footer.less → scss/footer.scss} +0 -1
  10. package/{less/groups.less → scss/groups.scss} +14 -38
  11. package/{less/header.less → scss/header.scss} +63 -139
  12. package/{less/helpers.less → scss/helpers.scss} +0 -0
  13. package/{less/keyframes.less → scss/keyframes.scss} +0 -0
  14. package/{less/mixins.less → scss/mixins.scss} +17 -59
  15. package/{less/mobile.less → scss/mobile.scss} +13 -18
  16. package/{less/modules/alerts.less → scss/modules/alerts.scss} +21 -21
  17. package/{less/modules/composer-default.less → scss/modules/composer-default.scss} +2 -2
  18. package/{less/modules/cookie-consent.less → scss/modules/cookie-consent.scss} +1 -1
  19. package/{less/modules/fab.less → scss/modules/fab.scss} +2 -2
  20. package/{less/modules/morph.less → scss/modules/morph.scss} +1 -1
  21. package/{less/modules/necro-post.less → scss/modules/necro-post.scss} +0 -0
  22. package/scss/modules/nprogress.scss +80 -0
  23. package/{less/modules/taskbar.less → scss/modules/taskbar.scss} +11 -10
  24. package/{less/modules/usercard.less → scss/modules/usercard.scss} +0 -0
  25. package/{less/noscript.less → scss/noscript.scss} +5 -7
  26. package/{less/outgoing.less → scss/outgoing.scss} +0 -0
  27. package/scss/overrides.scss +44 -0
  28. package/{less/persona.less → scss/persona.scss} +1 -13
  29. package/{less/posts_list.less → scss/posts_list.scss} +11 -14
  30. package/{less/register.less → scss/register.scss} +2 -7
  31. package/scss/search.scss +39 -0
  32. package/{less/style.less → scss/style.scss} +23 -47
  33. package/scss/tags.scss +11 -0
  34. package/{less/topic.less → scss/topic.scss} +53 -90
  35. package/scss/topics_list.scss +17 -0
  36. package/{less/variables.less → scss/variables.scss} +3 -3
  37. package/templates/account/blocks.tpl +24 -26
  38. package/templates/account/categories.tpl +6 -6
  39. package/templates/account/consent.tpl +10 -10
  40. package/templates/account/edit/password.tpl +8 -10
  41. package/templates/account/edit/username.tpl +6 -10
  42. package/templates/account/edit.tpl +23 -23
  43. package/templates/account/followers.tpl +3 -3
  44. package/templates/account/following.tpl +3 -3
  45. package/templates/account/groups.tpl +2 -2
  46. package/templates/account/info.tpl +67 -72
  47. package/templates/account/posts.tpl +1 -1
  48. package/templates/account/profile.tpl +20 -18
  49. package/templates/account/sessions.tpl +3 -3
  50. package/templates/account/settings.tpl +93 -81
  51. package/templates/account/topics.tpl +5 -5
  52. package/templates/account/uploads.tpl +2 -2
  53. package/templates/admin/plugins/persona.tpl +3 -3
  54. package/templates/category.tpl +15 -14
  55. package/templates/chat.tpl +16 -9
  56. package/templates/chats.tpl +5 -3
  57. package/templates/flags/detail.tpl +86 -80
  58. package/templates/flags/list.tpl +4 -4
  59. package/templates/footer.tpl +1 -1
  60. package/templates/groups/details.tpl +23 -218
  61. package/templates/groups/list.tpl +11 -9
  62. package/templates/groups/members.tpl +1 -4
  63. package/templates/header.tpl +10 -4
  64. package/templates/ip-blacklist.tpl +22 -20
  65. package/templates/login.tpl +17 -14
  66. package/templates/modules/taskbar.tpl +1 -1
  67. package/templates/modules/usercard.tpl +2 -2
  68. package/templates/notifications.tpl +40 -38
  69. package/templates/partials/acceptTos.tpl +8 -8
  70. package/templates/partials/account/category-item.tpl +6 -5
  71. package/templates/partials/account/header.tpl +2 -2
  72. package/templates/partials/account/menu.tpl +37 -37
  73. package/templates/partials/breadcrumbs.tpl +1 -1
  74. package/templates/partials/buttons/newTopic.tpl +10 -3
  75. package/templates/partials/categories/item.tpl +24 -10
  76. package/templates/partials/categories/lastpost.tpl +3 -3
  77. package/templates/partials/categories/link.tpl +10 -10
  78. package/templates/partials/category/sort.tpl +7 -7
  79. package/templates/partials/category/subcategory.tpl +3 -3
  80. package/templates/partials/category/tags.tpl +3 -5
  81. package/templates/partials/category/tools.tpl +16 -16
  82. package/templates/partials/category/watch.tpl +8 -10
  83. package/templates/partials/category-filter-content.tpl +17 -5
  84. package/templates/partials/category-filter-right.tpl +1 -1
  85. package/templates/partials/category-selector-content.tpl +17 -4
  86. package/templates/partials/category-selector-right.tpl +1 -1
  87. package/templates/partials/chats/message-window.tpl +10 -8
  88. package/templates/partials/chats/message.tpl +11 -11
  89. package/templates/partials/chats/options.tpl +8 -8
  90. package/templates/partials/chats/recent_room.tpl +1 -1
  91. package/templates/partials/chats/system-message.tpl +1 -1
  92. package/templates/partials/chats/user.tpl +1 -1
  93. package/templates/partials/chats-menu.tpl +11 -11
  94. package/templates/partials/cookie-consent.tpl +1 -1
  95. package/templates/partials/flags/filters.tpl +34 -32
  96. package/templates/partials/groups/admin.tpl +195 -0
  97. package/templates/partials/groups/badge.tpl +1 -0
  98. package/templates/partials/groups/list.tpl +6 -6
  99. package/templates/partials/groups/memberlist.tpl +11 -10
  100. package/templates/partials/menu.tpl +149 -156
  101. package/templates/partials/notifications_list.tpl +2 -2
  102. package/templates/partials/paginator.tpl +21 -21
  103. package/templates/partials/post_bar.tpl +4 -4
  104. package/templates/partials/posts_list.tpl +1 -1
  105. package/templates/partials/posts_list_item.tpl +2 -2
  106. package/templates/partials/quick-search-results.tpl +14 -11
  107. package/templates/partials/slideout-menu.tpl +1 -1
  108. package/templates/partials/tags_list.tpl +3 -3
  109. package/templates/partials/thread_tools.tpl +4 -4
  110. package/templates/partials/toast.tpl +14 -0
  111. package/templates/partials/topic/deleted-message.tpl +2 -2
  112. package/templates/partials/topic/event.tpl +26 -0
  113. package/templates/partials/topic/navigation-post.tpl +3 -3
  114. package/templates/partials/topic/navigator.tpl +7 -7
  115. package/templates/partials/topic/necro-post.tpl +1 -1
  116. package/templates/partials/topic/post-menu-list.tpl +26 -23
  117. package/templates/partials/topic/post-menu.tpl +3 -3
  118. package/templates/partials/topic/post.tpl +49 -44
  119. package/templates/partials/topic/quickreply.tpl +3 -3
  120. package/templates/partials/topic/reply-button.tpl +3 -3
  121. package/templates/partials/topic/sort.tpl +5 -5
  122. package/templates/partials/topic/tag.tpl +1 -0
  123. package/templates/partials/topic/tags.tpl +3 -5
  124. package/templates/partials/topic/topic-menu-list.tpl +18 -16
  125. package/templates/partials/topic/watch.tpl +11 -10
  126. package/templates/partials/topic-filters.tpl +12 -0
  127. package/templates/partials/topic-terms.tpl +12 -0
  128. package/templates/partials/topics_list.tpl +27 -25
  129. package/templates/partials/users_list.tpl +22 -10
  130. package/templates/partials/users_list_menu.tpl +19 -9
  131. package/templates/popular.tpl +9 -35
  132. package/templates/post-queue.tpl +42 -35
  133. package/templates/recent.tpl +10 -24
  134. package/templates/register.tpl +17 -17
  135. package/templates/registerComplete.tpl +14 -10
  136. package/templates/reset.tpl +7 -5
  137. package/templates/reset_code.tpl +9 -9
  138. package/templates/search.tpl +100 -87
  139. package/templates/tag.tpl +8 -10
  140. package/templates/tags.tpl +5 -3
  141. package/templates/top.tpl +9 -35
  142. package/templates/topic.tpl +13 -11
  143. package/templates/tos.tpl +4 -4
  144. package/templates/unread.tpl +10 -22
  145. package/templates/users.tpl +7 -20
  146. package/theme.json +6 -6
  147. package/theme.scss +1 -0
  148. package/less/bootstrap/.csscomb.json +0 -297
  149. package/less/bootstrap/.csslintrc +0 -19
  150. package/less/bootstrap/alerts.less +0 -73
  151. package/less/bootstrap/badges.less +0 -66
  152. package/less/bootstrap/bootstrap.less +0 -50
  153. package/less/bootstrap/breadcrumbs.less +0 -26
  154. package/less/bootstrap/button-groups.less +0 -243
  155. package/less/bootstrap/buttons.less +0 -160
  156. package/less/bootstrap/carousel.less +0 -269
  157. package/less/bootstrap/close.less +0 -34
  158. package/less/bootstrap/code.less +0 -69
  159. package/less/bootstrap/component-animations.less +0 -33
  160. package/less/bootstrap/dropdowns.less +0 -214
  161. package/less/bootstrap/forms.less +0 -574
  162. package/less/bootstrap/glyphicons.less +0 -305
  163. package/less/bootstrap/grid.less +0 -84
  164. package/less/bootstrap/input-groups.less +0 -166
  165. package/less/bootstrap/jumbotron.less +0 -50
  166. package/less/bootstrap/labels.less +0 -64
  167. package/less/bootstrap/list-group.less +0 -124
  168. package/less/bootstrap/media.less +0 -61
  169. package/less/bootstrap/mixins/alerts.less +0 -14
  170. package/less/bootstrap/mixins/background-variant.less +0 -8
  171. package/less/bootstrap/mixins/border-radius.less +0 -18
  172. package/less/bootstrap/mixins/buttons.less +0 -52
  173. package/less/bootstrap/mixins/center-block.less +0 -7
  174. package/less/bootstrap/mixins/clearfix.less +0 -22
  175. package/less/bootstrap/mixins/forms.less +0 -85
  176. package/less/bootstrap/mixins/gradients.less +0 -59
  177. package/less/bootstrap/mixins/grid-framework.less +0 -91
  178. package/less/bootstrap/mixins/grid.less +0 -122
  179. package/less/bootstrap/mixins/hide-text.less +0 -21
  180. package/less/bootstrap/mixins/image.less +0 -33
  181. package/less/bootstrap/mixins/labels.less +0 -12
  182. package/less/bootstrap/mixins/list-group.less +0 -29
  183. package/less/bootstrap/mixins/nav-divider.less +0 -10
  184. package/less/bootstrap/mixins/nav-vertical-align.less +0 -9
  185. package/less/bootstrap/mixins/opacity.less +0 -8
  186. package/less/bootstrap/mixins/pagination.less +0 -23
  187. package/less/bootstrap/mixins/panels.less +0 -24
  188. package/less/bootstrap/mixins/progress-bar.less +0 -10
  189. package/less/bootstrap/mixins/reset-filter.less +0 -8
  190. package/less/bootstrap/mixins/resize.less +0 -6
  191. package/less/bootstrap/mixins/responsive-visibility.less +0 -15
  192. package/less/bootstrap/mixins/size.less +0 -10
  193. package/less/bootstrap/mixins/tab-focus.less +0 -9
  194. package/less/bootstrap/mixins/table-row.less +0 -28
  195. package/less/bootstrap/mixins/text-emphasis.less +0 -8
  196. package/less/bootstrap/mixins/text-overflow.less +0 -8
  197. package/less/bootstrap/mixins/vendor-prefixes.less +0 -227
  198. package/less/bootstrap/mixins.less +0 -39
  199. package/less/bootstrap/modals.less +0 -150
  200. package/less/bootstrap/navbar.less +0 -660
  201. package/less/bootstrap/navs.less +0 -242
  202. package/less/bootstrap/normalize.less +0 -427
  203. package/less/bootstrap/pager.less +0 -54
  204. package/less/bootstrap/pagination.less +0 -88
  205. package/less/bootstrap/panels.less +0 -265
  206. package/less/bootstrap/popovers.less +0 -135
  207. package/less/bootstrap/print.less +0 -107
  208. package/less/bootstrap/progress-bars.less +0 -87
  209. package/less/bootstrap/responsive-embed.less +0 -35
  210. package/less/bootstrap/responsive-utilities.less +0 -194
  211. package/less/bootstrap/scaffolding.less +0 -162
  212. package/less/bootstrap/tables.less +0 -234
  213. package/less/bootstrap/theme.less +0 -273
  214. package/less/bootstrap/thumbnails.less +0 -36
  215. package/less/bootstrap/tooltip.less +0 -102
  216. package/less/bootstrap/type.less +0 -302
  217. package/less/bootstrap/utilities.less +0 -55
  218. package/less/bootstrap/variables.less +0 -861
  219. package/less/bootstrap/wells.less +0 -29
  220. package/less/bootstrap-flipped.css +0 -1550
  221. package/less/ip-blacklist.less +0 -7
  222. package/less/modules/bottom-sheet.less +0 -60
  223. package/less/modules/nprogress.less +0 -80
  224. package/less/notifications.less +0 -38
  225. package/less/post-queue.less +0 -19
  226. package/less/rtl.less +0 -132
  227. package/less/search.less +0 -96
  228. package/less/tags.less +0 -37
  229. package/less/topics_list.less +0 -16
  230. package/less/users.less +0 -73
  231. package/templates/alert.tpl +0 -15
  232. package/templates/partials/change_owner_modal.tpl +0 -22
  233. package/templates/partials/delete_posts_modal.tpl +0 -19
  234. package/templates/partials/fork_thread_modal.tpl +0 -22
  235. package/templates/partials/merge_topics_modal.tpl +0 -58
  236. package/templates/partials/modals/change_picture_modal.tpl +0 -73
  237. package/templates/partials/modals/flag_modal.tpl +0 -45
  238. package/templates/partials/modals/manage_room.tpl +0 -11
  239. package/templates/partials/modals/manage_room_users.tpl +0 -7
  240. package/templates/partials/modals/post_history.tpl +0 -36
  241. package/templates/partials/modals/rename_room.tpl +0 -4
  242. package/templates/partials/modals/upload_file_modal.tpl +0 -44
  243. package/templates/partials/modals/upload_picture_from_url_modal.tpl +0 -17
  244. package/templates/partials/modals/votes_modal.tpl +0 -10
  245. package/templates/partials/move_thread_modal.tpl +0 -17
  246. package/templates/partials/topic/badge.tpl +0 -5
  247. package/theme.less +0 -2
@@ -1,20 +1,20 @@
1
1
  <!-- IMPORT partials/breadcrumbs.tpl -->
2
2
 
3
3
  <div class="row">
4
- <div class="col-sm-12">
4
+ <div class="col-12">
5
5
  <h2 class="h4">
6
6
  {target_readable}
7
- <small><span class="timeago" title="{datetimeISO}"></span></small>
7
+ <small><span class="text-muted timeago" title="{datetimeISO}"></span></small>
8
8
  </h2>
9
9
 
10
10
  <hr />
11
11
 
12
12
  <!-- IF type_bool.post -->
13
- <div class="media">
14
- <div class="media-left">
15
- <a href="{config.relative_path}/user/{target.user.userslug}">{buildAvatar(target.user, "lg", false, "media-object")}</a>
13
+ <div class="d-flex">
14
+ <div class="flex-shrink-0">
15
+ <a href="{config.relative_path}/user/{target.user.userslug}">{buildAvatar(target.user, "64px", true, "media-object")}</a>
16
16
  </div>
17
- <div class="media-body">
17
+ <div class="flex-grow-1 ms-3">
18
18
  <h4 class="media-heading"><a href="{config.relative_path}/user/{target.user.userslug}">{target.user.username}</a></h4>
19
19
  {target.content}
20
20
  </div>
@@ -22,11 +22,11 @@
22
22
  <!-- ENDIF type_bool.post -->
23
23
 
24
24
  <!-- IF type_bool.user -->
25
- <div class="media">
26
- <div class="media-left">
27
- <a href="{config.relative_path}/user/{target.userslug}">{buildAvatar(target, "lg", false, "media-object")}</a>
25
+ <div class="d-flex">
26
+ <div class="flex-shrink-0">
27
+ <a href="{config.relative_path}/user/{target.userslug}">{buildAvatar(target, "64px", true, "media-object")}</a>
28
28
  </div>
29
- <div class="media-body">
29
+ <div class="flex-grow-1 ms-3">
30
30
  <h4 class="media-heading"><a href="{config.relative_path}/user/{target.userslug}">{target.username}</a></h4>
31
31
  <p class="lead">
32
32
  <a href="{config.relative_path}/uid/{target.uid}">[[flags:user-view]]</a> |
@@ -37,7 +37,7 @@
37
37
  <!-- ENDIF type_bool.user -->
38
38
 
39
39
  <!-- IF type_bool.empty -->
40
- <div class="alert alert-warning">[[flags:target-purged]]</div>
40
+ <div class="alert alert-warning" role="alert">[[flags:target-purged]]</div>
41
41
  <!-- ENDIF type_bool.empty -->
42
42
 
43
43
  <hr />
@@ -45,28 +45,28 @@
45
45
  <div class="row">
46
46
  <div class="col-sm-6">
47
47
  <form role="form" id="attributes">
48
- <div class="form-group">
48
+ <div class="mb-3">
49
49
  <h2 class="h4">[[flags:reports]]</h2>
50
50
  <ul class="list-group" component="flag/reports">
51
51
  {{{ each reports }}}
52
52
  <li class="list-group-item">
53
- <a href="{config.relative_path}/user/{./reporter.userslug}">{buildAvatar(./reporter, "sm", false)}</a>
53
+ <a href="{config.relative_path}/user/{./reporter.userslug}">{buildAvatar(./reporter, "24px", true)}</a>
54
54
  &ndash; <span class="timeago" title="{./timestampISO}"></span>
55
55
  <blockquote><em>{./value}</em></blockquote>
56
56
  </li>
57
57
  {{{ end }}}
58
58
  </ul>
59
59
  </div>
60
- <div class="form-group">
60
+ <div class="mb-3">
61
61
  <h2 class="h4" for="state">[[flags:state]]</h2>
62
- <select class="form-control" id="state" name="state" disabled>
62
+ <select class="form-select" id="state" name="state" disabled>
63
63
  <option value="open">[[flags:state-open]]</option>
64
64
  <option value="wip">[[flags:state-wip]]</option>
65
65
  <option value="resolved">[[flags:state-resolved]]</option>
66
66
  <option value="rejected">[[flags:state-rejected]]</option>
67
67
  </select>
68
68
  </div>
69
- <div class="form-group">
69
+ <div class="mb-3">
70
70
  <h2 class="h4" for="assignee">[[flags:assignee]]</h2>
71
71
  <select class="form-control" id="assignee" name="assignee" disabled>
72
72
  <option value="">[[flags:no-assignee]]</option>
@@ -75,16 +75,20 @@
75
75
  {{{end}}}
76
76
  </select>
77
77
  </div>
78
- <button type="button" class="btn btn-block btn-primary" data-action="update">[[flags:update]]</button>
78
+ <div class="d-grid">
79
+ <button type="button" class="btn btn-primary" data-action="update">[[flags:update]]</button>
80
+ </div>
79
81
  </form>
80
82
 
81
83
  <hr />
82
84
 
83
85
  <form role="form">
84
- <div class="form-group">
86
+ <div class="mb-3">
85
87
  <h2 class="h4" for="note">[[flags:notes]]</h2>
86
88
  <textarea id="note" class="form-control"></textarea>
87
- <button type="button" class="btn btn-block btn-primary" data-action="appendNote">[[flags:add-note]]</button>
89
+ <div class="d-grid">
90
+ <button type="button" class="btn btn-block btn-primary" data-action="appendNote">[[flags:add-note]]</button>
91
+ </div>
88
92
  </div>
89
93
  </form>
90
94
 
@@ -93,20 +97,20 @@
93
97
  <div class="alert alert-success text-center">[[flags:no-notes]]</div>
94
98
  <!-- ENDIF !notes.length -->
95
99
  {{{each notes}}}
96
- <div class="media" data-datetime="{../datetime}" data-index="{@index}">
97
- <div class="media-left">
98
- <a href="{config.relative_path}/user/{../user.userslug}">{buildAvatar(notes.user, "md", false, "media-object")}</a>
100
+ <div class="d-flex mb-3">
101
+ <div class="flex-shrink-0">
102
+ <a href="{config.relative_path}/user/{../user.userslug}">{buildAvatar(notes.user, "32px", true, "media-object")}</a>
99
103
  </div>
100
- <div class="media-body">
101
- <h4 class="media-heading">
104
+ <div class="flex-grow-1 mx-3">
105
+ <h2 class="h5">
102
106
  <a href="{config.relative_path}/user/{../user.userslug}">{../user.username}</a>
103
107
  <small><span class="timeago" title="{../datetimeISO}"></span></small>
104
108
  </h4>
105
109
  {../content}
106
110
  </div>
107
- <div class="media-right">
108
- <a href="#" data-action="prepare-edit"><i class="fa fa-pencil"></i></a>
109
- <a href="#" data-action="delete-note"><i class="fa fa-trash text-danger"></i></a>
111
+ <div class="flex-shrink-0">
112
+ <a href="#" class="btn btn-sm btn-link" data-action="prepare-edit"><i class="fa fa-pencil"></i></a>
113
+ <a href="#" class="btn btn-sm btn-link" data-action="delete-note"><i class="fa fa-trash text-danger"></i></a>
110
114
  </div>
111
115
  </div>
112
116
  {{{end}}}
@@ -115,54 +119,56 @@
115
119
  <div class="col-sm-6">
116
120
  <h2 class="h4">[[flags:quick-actions]]</h2>
117
121
 
118
- <a class="btn btn-default btn-block" href="{config.relative_path}/{type_path}/{targetId}">
119
- <i class="fa fa-external-link"></i>
120
- [[flags:go-to-target]]
121
- </a>
122
-
123
- <a class="btn btn-default btn-block" href="#" data-action="assign">
124
- <i class="fa fa-id-card-o"></i>
125
- [[flags:assign-to-me]]
126
- </a>
127
-
128
- {{{ if type_bool.post }}}
129
- {{{ if !target.deleted}}}
130
- <a class="btn btn-danger btn-block" href="#" data-action="delete-post"><i class="fa fa-trash"></i> [[flags:delete-post]]</a>
131
- {{{ else }}}
132
- <a class="btn btn-danger btn-block" href="#" data-action="purge-post"><i class="fa fa-trash"></i> [[flags:purge-post]]</a>
133
- <a class="btn btn-success btn-block" href="#" data-action="restore-post"><i class="fa fa-reply"></i><i class="fa fa-trash"></i> [[flags:restore-post]]</a>
134
- {{{ end }}}
135
- {{{ end }}}
136
-
137
- {{{ if target.uid }}}
138
- <div class="btn-group btn-block" data-uid="{target.uid}">
139
- <button type="button" class="btn btn-default btn-block dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
140
- <i class="fa fa-street-view"></i>
141
- [[flags:flagged-user]]
142
- <span class="caret"></span>
143
- </button>
144
- <ul class="dropdown-menu">
145
- <li><a href="{config.relative_path}/uid/{target.uid}">[[flags:view-profile]]</a></li>
146
- {{{ if !config.disableChat }}}
147
- <li><a href="#" data-action="chat">[[flags:start-new-chat]]</a></li>
148
- {{{ end }}}
149
- <li role="separator" class="divider"></li>
150
- {{{ if privileges.ban }}}
151
- <li class="{{{ if target.user.banned }}}hidden{{{ end }}}"><a href="#" data-action="ban">[[user:ban_account]]</a></li>
152
- <li class="{{{ if !target.user.banned }}}hidden{{{ end }}}"><a href="#" data-action="unban">[[user:unban_account]]</a></li>
153
- {{{ end }}}
154
- {{{ if privileges.mute}}}
155
- <li class="{{{ if target.user.muted }}}hidden{{{ end }}}"><a href="#" data-action="mute">[[user:mute_account]]</a></li>
156
- <li class="{{{ if !target.user.muted }}}hidden{{{ end }}}"><a href="#" data-action="unmute">[[user:unmute_account]]</a></li>
157
- {{{ end }}}
158
- {{{ if privileges.admin:users }}}
159
- <li><a href="#" data-action="delete-account">[[user:delete_account_as_admin]]</a></li>
160
- <li><a href="#" data-action="delete-content">[[user:delete_content]]</a></li>
161
- <li><a href="#" data-action="delete-all">[[user:delete_all]]</a></li>
162
- {{{ end }}}
163
- </ul>
122
+ <div class="d-grid gap-1">
123
+ <a class="btn btn-light" href="{config.relative_path}/{type_path}/{targetId}">
124
+ <i class="fa fa-external-link"></i>
125
+ [[flags:go-to-target]]
126
+ </a>
127
+
128
+ <a class="btn btn-light" href="#" data-action="assign">
129
+ <i class="fa fa-id-card-o"></i>
130
+ [[flags:assign-to-me]]
131
+ </a>
132
+
133
+ {{{ if type_bool.post }}}
134
+ {{{ if !target.deleted}}}
135
+ <a class="btn btn-outline-danger" href="#" data-action="delete-post"><i class="fa fa-trash"></i> [[flags:delete-post]]</a>
136
+ {{{ else }}}
137
+ <a class="btn btn-danger" href="#" data-action="purge-post"><i class="fa fa-trash"></i> [[flags:purge-post]]</a>
138
+ <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>
139
+ {{{ end }}}
140
+ {{{ end }}}
141
+
142
+ {{{ if target.uid }}}
143
+ <div class="btn-group" data-uid="{target.uid}">
144
+ <button type="button" class="btn btn-light dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
145
+ <i class="fa fa-street-view"></i>
146
+ [[flags:flagged-user]]
147
+ <span class="caret"></span>
148
+ </button>
149
+ <ul class="dropdown-menu">
150
+ <li class="dropdown-item"><a href="{config.relative_path}/uid/{target.uid}">[[flags:view-profile]]</a></li>
151
+ {{{ if !config.disableChat }}}
152
+ <li class="dropdown-item"><a href="#" data-action="chat">[[flags:start-new-chat]]</a></li>
153
+ {{{ end }}}
154
+ <li><hr class="dropdown-divider"></li>
155
+ {{{ if privileges.ban }}}
156
+ <li class="dropdown-item" class="{{{ if target.user.banned }}}hidden{{{ end }}}"><a href="#" data-action="ban">[[user:ban_account]]</a></li>
157
+ <li class="dropdown-item" class="{{{ if !target.user.banned }}}hidden{{{ end }}}"><a href="#" data-action="unban">[[user:unban_account]]</a></li>
158
+ {{{ end }}}
159
+ {{{ if privileges.mute}}}
160
+ <li class="dropdown-item" class="{{{ if target.user.muted }}}hidden{{{ end }}}"><a href="#" data-action="mute">[[user:mute_account]]</a></li>
161
+ <li class="dropdown-item" class="{{{ if !target.user.muted }}}hidden{{{ end }}}"><a href="#" data-action="unmute">[[user:unmute_account]]</a></li>
162
+ {{{ end }}}
163
+ {{{ if privileges.admin:users }}}
164
+ <li class="dropdown-item"><a href="#" data-action="delete-account">[[user:delete_account_as_admin]]</a></li>
165
+ <li class="dropdown-item"><a href="#" data-action="delete-content">[[user:delete_content]]</a></li>
166
+ <li class="dropdown-item"><a href="#" data-action="delete-all">[[user:delete_all]]</a></li>
167
+ {{{ end }}}
168
+ </ul>
169
+ </div>
170
+ {{{ end }}}
164
171
  </div>
165
- {{{ end }}}
166
172
 
167
173
  <hr />
168
174
 
@@ -172,11 +178,11 @@
172
178
  <div class="alert alert-success text-center">[[flags:no-history]]</div>
173
179
  <!-- ENDIF !history.length -->
174
180
  {{{each history}}}
175
- <div class="media">
176
- <div class="media-left">
177
- <a href="{config.relative_path}/user/{../user.userslug}">{buildAvatar(history.user, "md", false, "media-object")}</a>
181
+ <div class="d-flex">
182
+ <div class="flex-shrink-0">
183
+ <a href="{config.relative_path}/user/{../user.userslug}">{buildAvatar(history.user, "32px", true, "media-object")}</a>
178
184
  </div>
179
- <div class="media-body">
185
+ <div class="flex-grow-1 ms-3">
180
186
  <h4 class="media-heading">
181
187
  <a href="{config.relative_path}/user/{../user.userslug}">{../user.username}</a>
182
188
  <small><span class="timeago" title="{../datetimeISO}"></span></small>
@@ -184,12 +190,12 @@
184
190
  <ul>
185
191
  {{{each ./fields}}}
186
192
  <li>
187
- <span class="label label-primary">[[flags:{@key}]]</span><!-- IF @value --> &rarr; <span class="label label-default">{@value}</span><!-- ENDIF @value -->
193
+ <span class="badge bg-primary">[[flags:{@key}]]</span><!-- IF @value --> &rarr; <span class="badge bg-light text-dark">{@value}</span><!-- ENDIF @value -->
188
194
  </li>
189
195
  {{{end}}}
190
196
  {{{ each ./meta }}}
191
197
  <li>
192
- <span class="label label-{{./labelClass}}">{{./key}}</span>{{{ if ./value }}} &rarr; <span class="label label-default">{{ ./value }}</span>{{{ end }}}
198
+ <span class="badge bg-{{./labelClass}}">{{./key}}</span>{{{ if ./value }}} &rarr; <span class="badge bg-light text-dark">{{ ./value }}</span>{{{ end }}}
193
199
  </li>
194
200
  {{{ end }}}
195
201
  </ul>
@@ -7,15 +7,15 @@
7
7
  <div class="col-sm-8 col-md-9">
8
8
  <!-- IF hasFilter -->
9
9
  <div class="alert alert-warning">
10
- <p class="pull-right">
10
+ <p class="float-end">
11
11
  <a href="{config.relative_path}/flags">[[flags:filter-reset]]</a>
12
12
  </p>
13
13
  [[flags:filter-active]]
14
14
  </div>
15
15
  <!-- ENDIF hasFilter -->
16
16
 
17
- <div class="btn-group pull-right" component="flags/bulk-actions">
18
- <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" autocomplete="off" aria-haspopup="true" aria-expanded="false" disabled="disabled">
17
+ <div class="btn-group float-end" component="flags/bulk-actions">
18
+ <button type="button" class="btn btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown" autocomplete="off" aria-haspopup="true" aria-expanded="false" disabled="disabled">
19
19
  <i class="fa fa-clone"></i> [[flags:bulk-actions]] <span class="caret"></span>
20
20
  </button>
21
21
  <ul class="dropdown-menu">
@@ -60,7 +60,7 @@
60
60
  {./heat}
61
61
  </td>
62
62
  <td><span class="timeago" title="{../datetimeISO}"></span></td>
63
- <td><span class="label label-{../labelClass}">[[flags:state-{../state}]]</span></td>
63
+ <td><span class="badge bg-{../labelClass}">[[flags:state-{../state}]]</span></td>
64
64
  </tr>
65
65
  {{{end}}}
66
66
  </tbody>
@@ -3,7 +3,7 @@
3
3
  <!-- IF !isSpider -->
4
4
  <div component="toaster/tray" class="alert-window">
5
5
  <div id="reconnect-alert" class="alert alert-dismissable alert-warning clearfix hide" component="toaster/toast">
6
- <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
6
+ <button type="button" class="btn-close float-end" data-bs-dismiss="alert" aria-hidden="true"></button>
7
7
  <p>[[global:reconnecting-message, {config.siteTitle}]]</p>
8
8
  </div>
9
9
  </div>
@@ -11,252 +11,57 @@
11
11
  <!-- ENDIF group.isOwner -->
12
12
  </div>
13
13
 
14
- <div class="col-xs-12">
14
+ <div class="col-12">
15
15
  <!-- IMPORT partials/breadcrumbs.tpl -->
16
16
  </div>
17
17
 
18
- <div class="col-lg-4 col-xs-12">
19
- <div class="panel panel-default">
20
- <div class="panel-heading">
21
- <h3 class="panel-title">
18
+ <div class="col-lg-4 col-12">
19
+ <div class="card mb-3">
20
+ <div class="card-header">
21
+ <span class="fs-5">
22
22
  <i class="fa fa-list-ul"></i> [[groups:details.title]]
23
- <!-- IF group.private --><span class="label label-info">[[groups:details.private]]</span><!-- ENDIF group.private -->
24
- <!-- IF group.hidden --><span class="label label-info">[[groups:details.hidden]]</span>&nbsp;<!-- ENDIF group.hidden -->
25
- </h3>
23
+ <!-- IF group.private --><span class="badge bg-info text-dark">[[groups:details.private]]</span><!-- ENDIF group.private -->
24
+ <!-- IF group.hidden --><span class="badge bg-info text-dark">[[groups:details.hidden]]</span>&nbsp;<!-- ENDIF group.hidden -->
25
+ </span>
26
26
  </div>
27
- <div class="panel-body">
28
- <h1>{group.displayName}</h1>
27
+ <div class="card-body">
28
+ <h2>{group.displayName}</h2>
29
29
  <p>{group.descriptionParsed}</p>
30
30
  <!-- IF isAdmin -->
31
- <div class="pull-right">
31
+ <div class="float-end">
32
32
  <a href="{config.relative_path}/admin/manage/groups/{group.nameEncoded}" target="_blank" class="btn btn-info"><i class="fa fa-gear"></i> [[user:edit]]</a>
33
33
  </div>
34
34
  <!-- ENDIF isAdmin -->
35
35
  <!-- IF loggedIn -->
36
- <div class="pull-right">
36
+ <div class="float-end">
37
37
  {function.membershipBtn, group}&nbsp;
38
38
  </div>
39
39
  <!-- ENDIF loggedIn -->
40
40
  </div>
41
41
  </div>
42
- <div class="panel panel-default">
43
- <div class="panel-heading">
44
- <h3 class="panel-title"><i class="fa fa-users"></i> [[groups:details.members]]</h3>
42
+
43
+ <div class="card mb-3">
44
+ <div class="card-header">
45
+ <span class="fs-5">
46
+ <i class="fa fa-users"></i> [[groups:details.members]]
47
+ </span>
45
48
  </div>
46
- <div class="panel-body">
49
+ <div class="card-body">
47
50
  <!-- IMPORT partials/groups/memberlist.tpl -->
48
51
  </div>
49
52
  </div>
50
- <!-- IF group.isOwner -->
51
- <div class="panel panel-default">
52
- <div class="panel-heading">
53
- <h3 class="panel-title clearfix">
54
- <i class="fa fa-clock-o"></i> [[groups:details.pending]]
55
- <!-- IF group.pending.length -->
56
- <div class="btn-group pull-right">
57
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
58
- [[global:more]] <span class="caret"></span>
59
- </button>
60
- <ul class="dropdown-menu" role="menu">
61
- <li><a href="#" data-ajaxify="false" data-action="acceptAll">[[groups:pending.accept_all]]</a></li>
62
- <li><a href="#" data-ajaxify="false" data-action="rejectAll">[[groups:pending.reject_all]]</a></li>
63
- </ul>
64
- </div>
65
- <!-- ENDIF group.pending.length -->
66
- </h3>
67
- </div>
68
- <div class="panel-body">
69
- <table component="groups/pending" class="table table-striped table-hover">
70
- <!-- IF !group.pending.length -->
71
- <div class="alert alert-info">[[groups:pending.none]]</div>
72
- <!-- ENDIF !group.pending.length -->
73
- {{{each group.pending}}}
74
- <tr data-uid="{group.pending.uid}">
75
- <td>
76
- <a href="{config.relative_path}/user/{group.pending.userslug}">{buildAvatar(group.pending, "sm", true)}</a>
77
- </td>
78
- <td class="member-name">
79
- <a href="{config.relative_path}/user/{group.pending.userslug}">{group.pending.username}</a>
80
- </td>
81
- <td>
82
- <div class="btn-group pull-right">
83
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
84
- [[global:more]] <span class="caret"></span>
85
- </button>
86
- <ul class="dropdown-menu" role="menu">
87
- <li><a href="#" data-ajaxify="false" data-action="accept">[[groups:pending.accept]]</a></li>
88
- <li><a href="#" data-ajaxify="false" data-action="reject">[[groups:pending.reject]]</a></li>
89
- </ul>
90
- </div>
91
- </td>
92
- </tr>
93
- {{{end}}}
94
- </table>
95
- </div>
96
- </div>
97
- <div class="panel panel-default">
98
- <div class="panel-heading">
99
- <h3 class="panel-title clearfix">
100
- <i class="fa fa-gift"></i> [[groups:details.invited]]
101
- </h3>
102
- </div>
103
- <div class="panel-body">
104
- <div class="input-group">
105
- <input class="form-control" type="text" component="groups/members/invite" placeholder="[[groups:invited.search]]"/>
106
- <span class="input-group-addon search-button"><i class="fa fa-search"></i></span>
107
- </div>
108
-
109
- <div class="form-group">
110
- <textarea class="form-control" component="groups/members/bulk-invite" placeholder="[[groups:bulk-invite-instructions]]"></textarea>
111
- </div>
112
-
113
- <div class="form-group clearfix">
114
- <button class="btn btn-default btn-sm pull-right" component="groups/members/bulk-invite-button">[[groups:bulk-invite]]</button>
115
- </div>
116
-
117
- <table component="groups/invited" class="table table-striped table-hover">
118
- <!-- IF !group.invited.length -->
119
- <div class="alert alert-info">[[groups:invited.none]]</div>
120
- <!-- ENDIF !group.invited.length -->
121
- {{{each group.invited}}}
122
- <tr data-uid="{group.invited.uid}">
123
- <td>
124
- <a href="{config.relative_path}/user/{group.invited.userslug}">{buildAvatar(group.invited, "sm", true)}</a>
125
- </td>
126
- <td class="member-name">
127
- <a href="{config.relative_path}/user/{group.invited.userslug}">{group.invited.username}</a>
128
- </td>
129
- <td>
130
- <div class="btn-group pull-right">
131
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
132
- [[global:more]] <span class="caret"></span>
133
- </button>
134
- <ul class="dropdown-menu" role="menu">
135
- <li><a href="#" data-ajaxify="false" data-action="rescindInvite">[[groups:invited.uninvite]]</a></li>
136
- </ul>
137
- </div>
138
- </td>
139
- </tr>
140
- {{{end}}}
141
- </table>
142
- </div>
143
- </div>
144
53
 
145
- <div class="panel panel-default">
146
- <div class="panel-heading pointer" data-toggle="collapse" data-target=".options">
147
- <h3 class="panel-title">
148
- <i class="fa fa-caret-down pull-right"></i>
149
- <i class="fa fa-cogs"></i> [[groups:details.owner_options]]
150
- </h3>
151
- </div>
152
-
153
- <div class="panel-body options collapse">
154
- <form component="groups/settings" role="form">
155
- <div class="form-group">
156
- <label for="name">[[groups:details.group_name]]</label>
157
- <input <!-- IF group.system -->readonly<!-- ENDIF group.system --> class="form-control" name="name" id="name" type="text" value="{group.displayName}" />
158
- </div>
159
- <div class="form-group">
160
- <label for="name">[[groups:details.description]]</label>
161
- <textarea class="form-control" name="description" id="description" type="text" maxlength="255">{group.description}</textarea>
162
- </div>
163
-
164
- <hr />
165
- <div class="form-group">
166
- <label for="memberPostCids">[[groups:details.member-post-cids]]</label>
167
- <div class="row">
168
- <div class="col-md-6">
169
- <input id="memberPostCids" type="text" class="form-control" value="{group.memberPostCids}">
170
- </div>
171
- <div class="col-md-6 member-post-cids-selector">
172
- <!-- IMPORT partials/category-selector.tpl -->
173
- </div>
174
- </div>
175
- </div>
176
-
177
- <hr />
178
-
179
- <div class="form-group user-title-option">
180
- <label for="userTitle">[[groups:details.badge_text]]</label>
181
- <input component="groups/userTitleOption" class="form-control" name="userTitle" id="userTitle" type="text" maxlength="40" value="{group.userTitleEscaped}"<!-- IF !group.userTitleEnabled --> disabled<!-- ENDIF !group.userTitleEnabled --> />
182
- </div>
183
-
184
- <div class="form-group user-title-option">
185
- <label>[[groups:details.badge_preview]]</label><br />
186
- <span class="label<!-- IF !group.userTitleEnabled --> hide<!-- ENDIF !group.userTitleEnabled -->" style="color: {group.textColor}; background-color: {group.labelColor}"><i class="fa<!-- IF group.icon --> {group.icon}<!-- ENDIF group.icon -->"></i> <span class="label-text"><!-- IF group.userTitle -->{group.userTitle}<!-- ELSE -->{group.displayName}<!-- ENDIF group.userTitle --></span></span>
187
-
188
- <hr/>
189
- <button component="groups/userTitleOption" type="button" class="btn btn-default btn-sm" data-action="icon-select"<!-- IF !group.userTitleEnabled --> disabled<!-- ENDIF !group.userTitleEnabled -->>[[groups:details.change_icon]]</button>
190
- <div>
191
- <label for="labelColor" class="badge-color-label">[[groups:details.change_label_colour]]</label>
192
- <input component="groups/userTitleOption" type="color" name="labelColor" value="<!-- IF group.labelColor -->{group.labelColor}<!-- ENDIF group.labelColor -->" />
193
- </div>
194
- <div>
195
- <label for="color" class="badge-color-label">[[groups:details.change_text_colour]]</label>
196
- <input component="groups/userTitleOption" type="color" name="textColor" value="<!-- IF group.textColor -->{group.textColor}<!-- ENDIF group.textColor -->" />
197
- </div>
198
- <input type="hidden" name="icon" value="<!-- IF group.icon -->{group.icon}<!-- ENDIF group.icon -->" />
199
-
200
- <div id="icons" class="hidden">
201
- <div class="icon-container">
202
- <div class="row fa-icons">
203
- <i class="fa fa-doesnt-exist"></i>
204
- <!-- IMPORT partials/fontawesome.tpl -->
205
- </div>
206
- </div>
207
- </div>
208
- </div>
209
- <hr />
210
- <div class="checkbox">
211
- <label>
212
- <input name="userTitleEnabled" type="checkbox"<!-- IF group.userTitleEnabled --> checked<!-- ENDIF group.userTitleEnabled -->> <strong>[[groups:details.userTitleEnabled]]</strong>
213
- </label>
214
- </div>
215
- <div class="checkbox">
216
- <label>
217
- <input name="private" type="checkbox"<!-- IF group.private --> checked<!-- ENDIF group.private -->> <strong>[[groups:details.private]]</strong>
218
- <!-- IF !allowPrivateGroups -->
219
- <p class="help-block">
220
- [[groups:details.private_system_help]]
221
- </p>
222
- <!-- ENDIF !allowPrivateGroups -->
223
- <p class="help-block">
224
- [[groups:details.private_help]]
225
- </p>
226
- </label>
227
- </div>
228
- <div class="checkbox">
229
- <label>
230
- <input name="disableJoinRequests" type="checkbox"<!-- IF group.disableJoinRequests --> checked<!-- ENDIF group.disableJoinRequests -->> <strong>[[groups:details.disableJoinRequests]]</strong>
231
- </label>
232
- </div>
233
- <div class="checkbox">
234
- <label>
235
- <input name="disableLeave" type="checkbox"{{{if group.disableLeave}}} checked{{{end}}}> <strong>[[groups:details.disableLeave]]</strong>
236
- </label>
237
- </div>
238
- <div class="checkbox">
239
- <label>
240
- <input name="hidden" type="checkbox"<!-- IF group.hidden --> checked<!-- ENDIF group.hidden -->> <strong>[[groups:details.hidden]]</strong>
241
- <p class="help-block">
242
- [[groups:details.hidden_help]]
243
- </p>
244
- </label>
245
- </div>
246
-
247
- <button class="btn btn-link btn-xs pull-right" type="button" data-action="delete">[[groups:details.delete_group]]</button>
248
- <button class="btn btn-primary" type="button" data-action="update">[[global:save_changes]]</button>
249
- </form>
250
- </div>
251
- </div>
54
+ <!-- IF group.isOwner -->
55
+ <!-- IMPORT partials/groups/admin.tpl -->
252
56
  <!-- ENDIF group.isOwner -->
57
+
253
58
  <div data-widget-area="left">
254
59
  {{{each widgets.left}}}
255
60
  {{widgets.left.html}}
256
61
  {{{end}}}
257
62
  </div>
258
63
  </div>
259
- <div class="col-lg-8 col-xs-12">
64
+ <div class="col-lg-8 col-12">
260
65
  <div class="col-lg-11">
261
66
  <!-- IF !posts.length -->
262
67
  <div class="alert alert-info">[[groups:details.has_no_posts]]</div>
@@ -5,25 +5,27 @@
5
5
  {{{end}}}
6
6
  </div>
7
7
  <div class="groups list">
8
- <div class="row">
9
- <div class="col-lg-4">
8
+ <div class="row justify-content-between">
9
+ <div class="col-lg-6">
10
10
  <!-- IF allowGroupCreation -->
11
11
  <button class="btn btn-primary" data-action="new"><i class="fa fa-plus"></i> [[groups:new_group]]</button>
12
12
  <!-- ENDIF allowGroupCreation -->
13
13
  </div>
14
- <div class="col-lg-8">
15
- <div class="row">
16
- <div class="col-xs-5 col-md-3 text-left pull-right">
17
- <select class="form-control" id="search-sort">
14
+ <div class="col-lg-6">
15
+ <div class="row justify-content-end">
16
+ <div class="col-5 col-md-6">
17
+ <select class="form-select" id="search-sort">
18
18
  <option value="alpha">[[groups:details.group_name]]</option>
19
19
  <option value="count">[[groups:details.member_count]]</option>
20
20
  <option value="date">[[groups:details.creation_date]]</option>
21
21
  </select>
22
22
  </div>
23
- <div class="col-xs-7 col-md-5 text-left pull-right">
23
+ <div class="col-7 col-md-6">
24
24
  <div class="input-group">
25
25
  <input type="text" class="form-control" placeholder="[[global:search]]" name="query" value="" id="search-text">
26
- <span id="search-button" class="input-group-addon search-button"><i class="fa fa-search"></i></span>
26
+ <button id="search-button" class="btn btn-primary">
27
+ <i class="fa fa-search"></i>
28
+ </button>
27
29
  </div>
28
30
  </div>
29
31
  </div>
@@ -36,7 +38,7 @@
36
38
  <!-- IF groups.length -->
37
39
  <!-- IMPORT partials/groups/list.tpl -->
38
40
  <!-- ELSE -->
39
- <div class="col-xs-12">
41
+ <div class="col-12">
40
42
  <div class="alert alert-warning">
41
43
  [[groups:no_groups_found]]
42
44
  </div>