nodebb-theme-harmony 2.0.0-pre.9 → 2.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 (163) hide show
  1. package/.eslintrc +3 -3
  2. package/README.md +22 -19
  3. package/lib/controllers.js +29 -29
  4. package/library.js +184 -190
  5. package/package.json +48 -48
  6. package/plugin.json +24 -25
  7. package/public/.eslintrc +3 -3
  8. package/public/admin.js +15 -15
  9. package/public/harmony.js +287 -287
  10. package/public/settings.js +31 -31
  11. package/renovate.json +6 -6
  12. package/scss/account.scss +27 -27
  13. package/scss/category.scss +3 -3
  14. package/scss/chats.scss +11 -11
  15. package/scss/common.scss +122 -128
  16. package/scss/fonts.scss +19 -19
  17. package/scss/groups.scss +22 -22
  18. package/scss/harmony.scss +24 -25
  19. package/scss/header.scss +15 -15
  20. package/scss/mixins.scss +183 -176
  21. package/scss/modals.scss +6 -6
  22. package/scss/modules/breadcrumbs.scss +15 -15
  23. package/scss/modules/cover.scss +102 -104
  24. package/scss/modules/filters.scss +7 -7
  25. package/scss/modules/nprogress.scss +80 -80
  26. package/scss/modules/paginator.scss +23 -23
  27. package/scss/modules/tags.scss +5 -5
  28. package/scss/modules/topic-navigator.scss +52 -52
  29. package/scss/modules/topics-list.scss +40 -40
  30. package/scss/modules/user-menu.scss +10 -10
  31. package/scss/overrides.scss +65 -61
  32. package/scss/sidebar.scss +188 -189
  33. package/scss/skins.scss +58 -49
  34. package/scss/status.scss +24 -24
  35. package/scss/topic.scss +130 -138
  36. package/templates/account/blocks.tpl +51 -40
  37. package/templates/account/categories.tpl +63 -63
  38. package/templates/account/consent.tpl +73 -73
  39. package/templates/account/edit/password.tpl +34 -34
  40. package/templates/account/edit/username.tpl +29 -30
  41. package/templates/account/edit.tpl +137 -122
  42. package/templates/account/followers.tpl +14 -14
  43. package/templates/account/following.tpl +15 -15
  44. package/templates/account/groups.tpl +15 -15
  45. package/templates/account/info.tpl +270 -201
  46. package/templates/account/posts.tpl +35 -35
  47. package/templates/account/profile.tpl +92 -95
  48. package/templates/account/read.tpl +1 -0
  49. package/templates/account/sessions.tpl +8 -8
  50. package/templates/account/settings.tpl +236 -236
  51. package/templates/account/shares.tpl +20 -0
  52. package/templates/account/tags.tpl +12 -12
  53. package/templates/account/theme.tpl +63 -63
  54. package/templates/account/topics.tpl +44 -43
  55. package/templates/account/uploads.tpl +37 -37
  56. package/templates/admin/plugins/harmony.tpl +57 -56
  57. package/templates/categories.tpl +29 -29
  58. package/templates/category.tpl +72 -72
  59. package/templates/footer.tpl +17 -17
  60. package/templates/groups/details.tpl +86 -86
  61. package/templates/groups/list.tpl +58 -56
  62. package/templates/groups/members.tpl +9 -9
  63. package/templates/header.tpl +45 -45
  64. package/templates/notifications.tpl +32 -32
  65. package/templates/partials/account/admin-menu.tpl +36 -36
  66. package/templates/partials/account/category-item.tpl +22 -22
  67. package/templates/partials/account/footer.tpl +2 -2
  68. package/templates/partials/account/header.tpl +98 -98
  69. package/templates/partials/account/session-list.tpl +18 -18
  70. package/templates/partials/account/sidebar-left.tpl +116 -102
  71. package/templates/partials/breadcrumbs-json-ld.tpl +16 -26
  72. package/templates/partials/breadcrumbs.tpl +12 -12
  73. package/templates/partials/buttons/newTopic.tpl +22 -22
  74. package/templates/partials/categories/item.tpl +56 -56
  75. package/templates/partials/categories/lastpost.tpl +24 -24
  76. package/templates/partials/categories/link.tpl +4 -4
  77. package/templates/partials/category/subcategory.tpl +18 -18
  78. package/templates/partials/category/tags.tpl +3 -3
  79. package/templates/partials/cookie-consent.tpl +6 -6
  80. package/templates/partials/groups/admin.tpl +95 -95
  81. package/templates/partials/groups/invited.tpl +32 -32
  82. package/templates/partials/groups/list.tpl +15 -15
  83. package/templates/partials/groups/memberlist.tpl +46 -46
  84. package/templates/partials/groups/pending.tpl +29 -29
  85. package/templates/partials/groups/sidebar-left.tpl +27 -27
  86. package/templates/partials/header/brand.tpl +27 -25
  87. package/templates/partials/mobile-footer.tpl +95 -98
  88. package/templates/partials/notifications_list.tpl +44 -44
  89. package/templates/partials/paginator.tpl +46 -46
  90. package/templates/partials/post_bar.tpl +27 -29
  91. package/templates/partials/posts_list.tpl +7 -7
  92. package/templates/partials/posts_list_item.tpl +19 -19
  93. package/templates/partials/quick-search-results.tpl +46 -46
  94. package/templates/partials/search-filters.tpl +183 -183
  95. package/templates/partials/search-results.tpl +54 -54
  96. package/templates/partials/sidebar/chats.tpl +45 -45
  97. package/templates/partials/sidebar/drafts.tpl +63 -63
  98. package/templates/partials/sidebar/logged-in-menu.tpl +22 -22
  99. package/templates/partials/sidebar/logged-out-menu.tpl +44 -44
  100. package/templates/partials/sidebar/notifications.tpl +49 -49
  101. package/templates/partials/sidebar/search-mobile.tpl +28 -28
  102. package/templates/partials/sidebar/search.tpl +30 -30
  103. package/templates/partials/sidebar/user-menu.tpl +103 -103
  104. package/templates/partials/sidebar-left.tpl +39 -42
  105. package/templates/partials/sidebar-right.tpl +16 -16
  106. package/templates/partials/skin-switcher.tpl +50 -50
  107. package/templates/partials/tags_list.tpl +7 -5
  108. package/templates/partials/toast.tpl +19 -19
  109. package/templates/partials/topic/event.tpl +12 -12
  110. package/templates/partials/topic/navigation-post.tpl +9 -9
  111. package/templates/partials/topic/navigator-mobile.tpl +61 -61
  112. package/templates/partials/topic/navigator.tpl +26 -26
  113. package/templates/partials/topic/necro-post.tpl +5 -5
  114. package/templates/partials/topic/post-menu-list.tpl +156 -140
  115. package/templates/partials/topic/post-menu.tpl +4 -30
  116. package/templates/partials/topic/post-placeholder.tpl +14 -14
  117. package/templates/partials/topic/post.tpl +146 -139
  118. package/templates/partials/topic/quickreply.tpl +28 -28
  119. package/templates/partials/topic/reply-button.tpl +26 -24
  120. package/templates/partials/topic/selection-tooltip.tpl +2 -2
  121. package/templates/partials/topic/sort.tpl +27 -27
  122. package/templates/partials/topic/stats.tpl +14 -14
  123. package/templates/partials/topic/thumbs.tpl +4 -4
  124. package/templates/partials/topic/tools.tpl +8 -12
  125. package/templates/partials/topic/topic-menu-list.tpl +73 -73
  126. package/templates/partials/topic/watch.tpl +59 -59
  127. package/templates/partials/topic-filters.tpl +15 -15
  128. package/templates/partials/topic-list-bar.tpl +54 -54
  129. package/templates/partials/topic-terms.tpl +15 -15
  130. package/templates/partials/topics_list.tpl +131 -123
  131. package/templates/partials/users/item.tpl +39 -37
  132. package/templates/partials/users_list.tpl +4 -4
  133. package/templates/partials/users_list_menu.tpl +14 -14
  134. package/templates/popular.tpl +34 -34
  135. package/templates/post-queue.tpl +211 -207
  136. package/templates/recent.tpl +42 -35
  137. package/templates/search.tpl +46 -46
  138. package/templates/tag.tpl +34 -34
  139. package/templates/tags.tpl +49 -49
  140. package/templates/top.tpl +34 -34
  141. package/templates/topic.tpl +123 -130
  142. package/templates/unread.tpl +31 -31
  143. package/templates/users.tpl +39 -39
  144. package/templates/world.tpl +66 -35
  145. package/theme.json +6 -6
  146. package/package-lock.json +0 -2368
  147. package/scss/modules/bottom-sheet.scss +0 -52
  148. package/templates/flags/detail.tpl +0 -179
  149. package/templates/flags/list.tpl +0 -6
  150. package/templates/login.tpl +0 -102
  151. package/templates/partials/category/filter-dropdown-content.tpl +0 -41
  152. package/templates/partials/category/selector-dropdown-content.tpl +0 -39
  153. package/templates/partials/category/sort.tpl +0 -39
  154. package/templates/partials/category/tools.tpl +0 -89
  155. package/templates/partials/category/watch.tpl +0 -67
  156. package/templates/partials/flags/bulk-actions.tpl +0 -9
  157. package/templates/partials/flags/filters.tpl +0 -189
  158. package/templates/partials/flags/results.tpl +0 -38
  159. package/templates/partials/groups/filter-dropdown-content.tpl +0 -25
  160. package/templates/partials/tags/filter-dropdown-content.tpl +0 -38
  161. package/templates/partials/tags/watch.tpl +0 -42
  162. package/templates/partials/users/filter-dropdown-content.tpl +0 -23
  163. package/templates/register.tpl +0 -104
@@ -1,17 +1,17 @@
1
-
2
- </div><!-- /.container#content -->
3
- </main>
4
- <!-- IMPORT partials/sidebar-right.tpl -->
5
- </div>
6
- <!-- IMPORT partials/mobile-footer.tpl -->
7
- {{{ if !isSpider }}}
8
- <div class="">
9
- <div component="toaster/tray" class="alert-window fixed-bottom mb-5 mb-md-2 me-2 me-md-5 ms-auto" style="width:300px; z-index: 1090;">
10
- <!-- IMPORT partials/reconnect-alert.tpl -->
11
- </div>
12
- </div>
13
- {{{ end }}}
14
-
15
- <!-- IMPORT partials/footer/js.tpl -->
16
- </body>
17
- </html>
1
+
2
+ </div><!-- /.container#content -->
3
+ </main>
4
+ <!-- IMPORT partials/sidebar-right.tpl -->
5
+ </div>
6
+ <!-- IMPORT partials/mobile-footer.tpl -->
7
+ {{{ if !isSpider }}}
8
+ <div>
9
+ <div component="toaster/tray" class="alert-window fixed-bottom mb-5 mb-md-2 me-2 me-md-5 ms-auto" style="width:300px; z-index: 1090;">
10
+ <!-- IMPORT partials/reconnect-alert.tpl -->
11
+ </div>
12
+ </div>
13
+ {{{ end }}}
14
+
15
+ <!-- IMPORT partials/footer/js.tpl -->
16
+ </body>
17
+ </html>
@@ -1,86 +1,86 @@
1
- <div component="groups/container" class="groups details">
2
- <div class="cover position-absolute start-0 top-0" component="groups/cover" style="background-image: url({group.cover:url}); background-position: {group.cover:position};">
3
- <div class="container">
4
- {{{ if group.isOwner }}}
5
- <div class="controls text-center">
6
- <span class="upload p-2 m-2 rounded-1 text-bg-light opacity-75"><i class="fa fa-fw fa-upload"></i></span>
7
- <span class="resize p-2 m-2 rounded-1 text-bg-light opacity-75"><i class="fa fa-fw fa-arrows"></i></span>
8
- <span class="remove p-2 m-2 rounded-1 text-bg-light opacity-75"><i class="fa fa-fw fa-times"></i></span>
9
- </div>
10
- <div class="save text-bg-primary">[[groups:cover-save]] <i class="fa fa-fw fa-floppy-o"></i></div>
11
- <div class="indicator text-bg-primary">[[groups:cover-saving]] <i class="fa fa-fw fa-refresh fa-spin"></i></div>
12
- {{{ end }}}
13
- </div>
14
- </div>
15
-
16
- <div class="d-flex flex-column flex-md-row justify-content-md-between pb-4 mb-4 mt-2 border-bottom">
17
- <div class="d-flex flex-column mt-1">
18
- <div class="d-flex align-items-center gap-2">
19
- <h3 class="mb-0">{group.displayName}</h3>
20
- </div>
21
- <div class="d-flex gap-2">
22
- {group.descriptionParsed}
23
- <div>
24
- {{{ if group.private }}}<span class="badge text-bg-light border border-1">[[groups:details.private]]</span>{{{ end }}}
25
- {{{ if group.hidden }}}<span class="badge text-bg-light border border-1">[[groups:details.hidden]]</span>{{{ end }}}
26
- </div>
27
- </div>
28
- </div>
29
- <div class="d-flex gap-2 align-items-start">
30
- {{{ if loggedIn }}}
31
- {function.membershipBtn, group}
32
- {{{ end }}}
33
- {{{ if isAdmin }}}
34
- <a href="{config.relative_path}/admin/manage/groups/{group.nameEncoded}" target="_blank" class="btn btn-light"><i class="fa fa-gear"></i> [[user:edit]]</a>
35
- {{{ end }}}
36
- </div>
37
- </div>
38
-
39
- <div class="d-flex flex-column flex-md-row">
40
- <div data-widget-area="left">
41
- {{{each widgets.left}}}
42
- {{widgets.left.html}}
43
- {{{end}}}
44
- </div>
45
- <!-- IMPORT partials/groups/sidebar-left.tpl -->
46
-
47
- <div class="flex-grow-1 ps-md-2 ps-lg-5" style="min-width:0;">
48
- <div class="tab-content">
49
- <div class="tab-pane fade show active" id="groups-posts" role="tabpanel">
50
- <h3 class="fw-semibold fs-5 mb-0">[[global:posts]]</h3>
51
- {{{ if !posts.length }}}
52
- <div class="alert alert-info my-2">[[groups:details.has-no-posts]]</div>
53
- {{{ end }}}
54
- <!-- IMPORT partials/posts_list.tpl -->
55
- </div>
56
- <div class="tab-pane fade" id="groups-members" role="tabpanel">
57
- <h3 class="fw-semibold fs-5 mb-3">[[groups:details.members]]</h3>
58
-
59
- <!-- IMPORT partials/groups/memberlist.tpl -->
60
- </div>
61
- {{{ if group.isOwner }}}
62
- <div class="tab-pane fade" id="groups-pending" role="tabpanel">
63
- <h3 class="fw-semibold fs-5 mb-3">[[groups:details.pending]]</h3>
64
- <!-- IMPORT partials/groups/pending.tpl -->
65
- </div>
66
-
67
- <div class="tab-pane fade" id="groups-invited" role="tabpanel">
68
- <h3 class="fw-semibold fs-5 mb-3">[[groups:details.invited]]</h3>
69
- <!-- IMPORT partials/groups/invited.tpl -->
70
- </div>
71
-
72
- <div class="tab-pane fade" id="groups-admin" role="tabpanel">
73
- <h3 class="fw-semibold fs-5 mb-3">[[groups:details.owner-options]]</h3>
74
- <!-- IMPORT partials/groups/admin.tpl -->
75
- </div>
76
- {{{ end }}}
77
- </div>
78
- </div>
79
-
80
- <div data-widget-area="right">
81
- {{{each widgets.right}}}
82
- {{widgets.right.html}}
83
- {{{end}}}
84
- </div>
85
- </div>
86
- </div>
1
+ <div component="groups/container" class="groups details">
2
+ <div class="cover position-absolute start-0 top-0" component="groups/cover" style="background-image: url({group.cover:url}); background-position: {group.cover:position};">
3
+ <div class="container">
4
+ {{{ if group.isOwner }}}
5
+ <div class="controls text-center">
6
+ <span class="upload p-2 m-2 rounded-1 text-bg-light opacity-75"><i class="fa fa-fw fa-upload"></i></span>
7
+ <span class="resize p-2 m-2 rounded-1 text-bg-light opacity-75"><i class="fa fa-fw fa-arrows"></i></span>
8
+ <span class="remove p-2 m-2 rounded-1 text-bg-light opacity-75"><i class="fa fa-fw fa-times"></i></span>
9
+ </div>
10
+ <div class="save text-bg-primary">[[groups:cover-save]] <i class="fa fa-fw fa-floppy-o"></i></div>
11
+ <div class="indicator text-bg-primary">[[groups:cover-saving]] <i class="fa fa-fw fa-refresh fa-spin"></i></div>
12
+ {{{ end }}}
13
+ </div>
14
+ </div>
15
+
16
+ <div class="d-flex flex-column flex-md-row justify-content-md-between pb-4 mb-4 mt-2 border-bottom">
17
+ <div class="d-flex flex-column mt-1">
18
+ <div class="d-flex align-items-center gap-2">
19
+ <h3 class="mb-0">{group.displayName}</h3>
20
+ </div>
21
+ <div class="d-flex gap-2">
22
+ {group.descriptionParsed}
23
+ <div>
24
+ {{{ if group.private }}}<span class="badge text-bg-light border border-1">[[groups:details.private]]</span>{{{ end }}}
25
+ {{{ if group.hidden }}}<span class="badge text-bg-light border border-1">[[groups:details.hidden]]</span>{{{ end }}}
26
+ </div>
27
+ </div>
28
+ </div>
29
+ <div class="d-flex gap-2 align-items-start">
30
+ {{{ if loggedIn }}}
31
+ {function.membershipBtn, group}
32
+ {{{ end }}}
33
+ {{{ if isAdmin }}}
34
+ <a href="{config.relative_path}/admin/manage/groups/{group.nameEncoded}" target="_blank" class="btn btn-light"><i class="fa fa-gear"></i> [[user:edit]]</a>
35
+ {{{ end }}}
36
+ </div>
37
+ </div>
38
+
39
+ <div class="d-flex flex-column flex-md-row">
40
+ <div data-widget-area="left">
41
+ {{{each widgets.left}}}
42
+ {{widgets.left.html}}
43
+ {{{end}}}
44
+ </div>
45
+ <!-- IMPORT partials/groups/sidebar-left.tpl -->
46
+
47
+ <div class="flex-grow-1 ps-md-2 ps-lg-5" style="min-width:0;">
48
+ <div class="tab-content">
49
+ <div class="tab-pane fade show active" id="groups-posts" role="tabpanel">
50
+ <h3 class="fw-semibold fs-5 mb-0">[[global:posts]]</h3>
51
+ {{{ if !posts.length }}}
52
+ <div class="alert alert-info my-2">[[groups:details.has-no-posts]]</div>
53
+ {{{ end }}}
54
+ <!-- IMPORT partials/posts_list.tpl -->
55
+ </div>
56
+ <div class="tab-pane fade" id="groups-members" role="tabpanel">
57
+ <h3 class="fw-semibold fs-5 mb-3">[[groups:details.members]]</h3>
58
+
59
+ <!-- IMPORT partials/groups/memberlist.tpl -->
60
+ </div>
61
+ {{{ if group.isOwner }}}
62
+ <div class="tab-pane fade" id="groups-pending" role="tabpanel">
63
+ <h3 class="fw-semibold fs-5 mb-3">[[groups:details.pending]]</h3>
64
+ <!-- IMPORT partials/groups/pending.tpl -->
65
+ </div>
66
+
67
+ <div class="tab-pane fade" id="groups-invited" role="tabpanel">
68
+ <h3 class="fw-semibold fs-5 mb-3">[[groups:details.invited]]</h3>
69
+ <!-- IMPORT partials/groups/invited.tpl -->
70
+ </div>
71
+
72
+ <div class="tab-pane fade" id="groups-admin" role="tabpanel">
73
+ <h3 class="fw-semibold fs-5 mb-3">[[groups:details.owner-options]]</h3>
74
+ <!-- IMPORT partials/groups/admin.tpl -->
75
+ </div>
76
+ {{{ end }}}
77
+ </div>
78
+ </div>
79
+
80
+ <div data-widget-area="right">
81
+ {{{each widgets.right}}}
82
+ {{widgets.right.html}}
83
+ {{{end}}}
84
+ </div>
85
+ </div>
86
+ </div>
@@ -1,56 +1,58 @@
1
- <div data-widget-area="header">
2
- {{{each widgets.header}}}
3
- {{widgets.header.html}}
4
- {{{end}}}
5
- </div>
6
- <div class="groups list">
7
- <h3 class="fw-semibold">[[pages:groups]]</h3>
8
- <div class="d-flex flex-wrap justify-content-between">
9
- <div class="mb-2 mb-md-0">
10
- <div class="text-sm d-flex flex-wrap align-items-center gap-2">
11
- [[topic:sort-by]]
12
- <div class="d-flex gap-2">
13
- <a href="?sort=alpha" class="btn-ghost ff-secondary fw-semibold {{{ if (sort == "alpha") }}}active{{{ end }}}">[[groups:details.group-name]]</a>
14
- <a href="?sort=count" class="btn-ghost ff-secondary fw-semibold {{{ if (sort == "count") }}}active{{{ end }}}">[[groups:details.member-count]]</a>
15
- <a href="?sort=date" class="btn-ghost ff-secondary fw-semibold {{{ if (sort == "date") }}}active{{{ end }}}">[[groups:details.creation-date]]</a>
16
- </div>
17
- </div>
18
- </div>
19
- <div class="">
20
- <div class="d-flex justify-content-end gap-2">
21
- <div class="">
22
- {{{ if allowGroupCreation }}}
23
- <button class="btn btn-primary btn-sm text-nowrap" data-action="new"><i class="fa fa-users"></i> [[groups:new-group]]</button>
24
- {{{ end }}}
25
- <select class="form-select hidden" id="search-sort">
26
- <option value="alpha">[[groups:details.group-name]]</option>
27
- <option value="count">[[groups:details.member-count]]</option>
28
- <option value="date">[[groups:details.creation-date]]</option>
29
- </select>
30
- </div>
31
- <div class="">
32
- <div class="input-group">
33
- <input type="text" class="form-control form-control-sm" placeholder="[[global:search]]" name="query" id="search-text">
34
- <button id="search-button" class="btn btn-primary btn-sm" aria-label="[[global:search]]">
35
- <i class="fa fa-search"></i>
36
- </button>
37
- </div>
38
- </div>
39
- </div>
40
- </div>
41
- </div>
42
-
43
- <hr />
44
-
45
- <div component="groups/container" class="row" id="groups-list" data-nextstart={nextStart}>
46
- {{{ if groups.length }}}
47
- <!-- IMPORT partials/groups/list.tpl -->
48
- {{{ else }}}
49
- <div class="col-12">
50
- <div class="alert alert-warning">
51
- [[groups:no-groups-found]]
52
- </div>
53
- </div>
54
- {{{ end }}}
55
- </div>
56
- </div>
1
+ <div data-widget-area="header">
2
+ {{{each widgets.header}}}
3
+ {{widgets.header.html}}
4
+ {{{end}}}
5
+ </div>
6
+ <div class="groups list">
7
+ <h3 class="fw-semibold">[[pages:groups]]</h3>
8
+ <div class="d-flex flex-wrap justify-content-between">
9
+ <div class="mb-2 mb-md-0">
10
+ <div class="text-sm d-flex flex-wrap align-items-center gap-2">
11
+ [[topic:sort-by]]
12
+ <div class="d-flex gap-2">
13
+ <a href="?sort=alpha" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if (sort == "alpha") }}}active{{{ end }}}">[[groups:details.group-name]]</a>
14
+ <a href="?sort=count" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if (sort == "count") }}}active{{{ end }}}">[[groups:details.member-count]]</a>
15
+ <a href="?sort=date" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if (sort == "date") }}}active{{{ end }}}">[[groups:details.creation-date]]</a>
16
+ </div>
17
+ </div>
18
+ </div>
19
+ <div>
20
+ <div class="d-flex justify-content-end gap-2">
21
+ <div>
22
+ {{{ if allowGroupCreation }}}
23
+ <button class="btn btn-primary btn-sm text-nowrap" data-action="new"><i class="fa fa-users"></i> [[groups:new-group]]</button>
24
+ {{{ end }}}
25
+ <select class="form-select hidden" id="search-sort">
26
+ <option value="alpha">[[groups:details.group-name]]</option>
27
+ <option value="count">[[groups:details.member-count]]</option>
28
+ <option value="date">[[groups:details.creation-date]]</option>
29
+ </select>
30
+ </div>
31
+ <div>
32
+ <div class="input-group">
33
+ <input type="text" class="form-control form-control-sm" placeholder="[[global:search]]" name="query" id="search-text">
34
+ <button id="search-button" class="btn btn-primary btn-sm" aria-label="[[global:search]]">
35
+ <i class="fa fa-search"></i>
36
+ </button>
37
+ </div>
38
+ </div>
39
+ </div>
40
+ </div>
41
+ </div>
42
+
43
+ <hr />
44
+
45
+ <div component="groups/container" class="row" id="groups-list">
46
+ {{{ if groups.length }}}
47
+ <!-- IMPORT partials/groups/list.tpl -->
48
+ {{{ else }}}
49
+ <div class="col-12">
50
+ <div class="alert alert-warning">
51
+ [[groups:no-groups-found]]
52
+ </div>
53
+ </div>
54
+ {{{ end }}}
55
+ </div>
56
+
57
+ <!-- IMPORT partials/paginator.tpl -->
58
+ </div>
@@ -1,10 +1,10 @@
1
- <!-- IMPORT partials/breadcrumbs.tpl -->
2
- <div class="users">
3
- <div id="users-container" class="users-container row row-cols-2 row-cols-md-3 row-cols-lg-4 row-cols-xl-5 g-4">
4
- {{{ each users }}}
5
- <!-- IMPORT partials/users/item.tpl -->
6
- {{{ end }}}
7
- </div>
8
-
9
- <!-- IMPORT partials/paginator.tpl -->
1
+ <!-- IMPORT partials/breadcrumbs.tpl -->
2
+ <div class="users">
3
+ <div id="users-container" class="users-container row row-cols-2 row-cols-md-3 row-cols-lg-4 row-cols-xl-5 g-4">
4
+ {{{ each users }}}
5
+ <!-- IMPORT partials/users/item.tpl -->
6
+ {{{ end }}}
7
+ </div>
8
+
9
+ <!-- IMPORT partials/paginator.tpl -->
10
10
  </div>
@@ -1,45 +1,45 @@
1
- <!DOCTYPE html>
2
- <html lang="{function.localeToHTML, userLang, defaultLang}" {{{if languageDirection}}}data-dir="{languageDirection}" style="direction: {languageDirection};"{{{end}}}>
3
- <head>
4
- <title>{browserTitle}</title>
5
- {{{each metaTags}}}{function.buildMetaTag}{{{end}}}
6
- <link rel="stylesheet" type="text/css" href="{relative_path}/assets/client{{{if bootswatchSkin}}}-{bootswatchSkin}{{{end}}}{{{ if (languageDirection=="rtl") }}}-rtl{{{ end }}}.css?{config.cache-buster}" />
7
- {{{each linkTags}}}{function.buildLinkTag}{{{end}}}
8
-
9
- <script>
10
- var config = JSON.parse('{{configJSON}}');
11
- var app = {
12
- user: JSON.parse('{{userJSON}}')
13
- };
14
-
15
- document.documentElement.style.setProperty('--panel-offset', `${localStorage.getItem('panelOffset') || 0}px`);
16
- </script>
17
-
18
- {{{if useCustomHTML}}}
19
- {{customHTML}}
20
- {{{end}}}
21
- {{{if useCustomCSS}}}
22
- <style>{{customCSS}}</style>
23
- {{{end}}}
24
- </head>
25
-
26
- <body class="{bodyClass} skin-{{{if bootswatchSkin}}}{bootswatchSkin}{{{else}}}noskin{{{end}}}">
27
- <a class="visually-hidden-focusable position-absolute top-0 start-0 p-3 m-3 bg-body" style="z-index: 1021;" href="#content">[[global:skip-to-content]]</a>
28
- <div class="layout-container d-flex justify-content-between pb-4 pb-md-0">
29
- <!-- IMPORT partials/sidebar-left.tpl -->
30
-
31
- <main id="panel" class="d-flex flex-column gap-3 flex-grow-1 mt-3" style="min-width: 0;">
32
- <!-- IMPORT partials/header/brand.tpl -->
33
- <script>
34
- const headerEl = document.getElementById('header-menu');
35
- if (headerEl) {
36
- const rect = headerEl.getBoundingClientRect();
37
- const offset = Math.max(0, rect.bottom);
38
- document.documentElement.style.setProperty('--panel-offset', offset + `px`);
39
- } else {
40
- document.documentElement.style.setProperty('--panel-offset', `0px`);
41
- }
42
- </script>
43
- <div class="container-lg px-md-4 d-flex flex-column gap-3 h-100 mb-5 mb-lg-0" id="content">
44
- <!-- IMPORT partials/noscript/warning.tpl -->
45
- <!-- IMPORT partials/noscript/message.tpl -->
1
+ <!DOCTYPE html>
2
+ <html lang="{function.localeToHTML, userLang, defaultLang}" {{{if languageDirection}}}data-dir="{languageDirection}" style="direction: {languageDirection};"{{{end}}}>
3
+ <head>
4
+ <title>{browserTitle}</title>
5
+ {{{each metaTags}}}{function.buildMetaTag}{{{end}}}
6
+ <link rel="stylesheet" type="text/css" href="{relative_path}/assets/client{{{if bootswatchSkin}}}-{bootswatchSkin}{{{end}}}{{{ if (languageDirection=="rtl") }}}-rtl{{{ end }}}.css?{config.cache-buster}" />
7
+ {{{each linkTags}}}{function.buildLinkTag}{{{end}}}
8
+
9
+ <script>
10
+ var config = JSON.parse('{{configJSON}}');
11
+ var app = {
12
+ user: JSON.parse('{{userJSON}}')
13
+ };
14
+
15
+ document.documentElement.style.setProperty('--panel-offset', `${localStorage.getItem('panelOffset') || 0}px`);
16
+ </script>
17
+
18
+ {{{if useCustomHTML}}}
19
+ {{customHTML}}
20
+ {{{end}}}
21
+ {{{if useCustomCSS}}}
22
+ <style>{{customCSS}}</style>
23
+ {{{end}}}
24
+ </head>
25
+
26
+ <body class="{bodyClass} skin-{{{if bootswatchSkin}}}{bootswatchSkin}{{{else}}}noskin{{{end}}}">
27
+ <a class="visually-hidden-focusable position-absolute top-0 start-0 p-3 m-3 bg-body" style="z-index: 1021;" href="#content">[[global:skip-to-content]]</a>
28
+ <div class="layout-container d-flex justify-content-between pb-4 pb-md-0">
29
+ <!-- IMPORT partials/sidebar-left.tpl -->
30
+
31
+ <main id="panel" class="d-flex flex-column gap-3 flex-grow-1 mt-3" style="min-width: 0;">
32
+ <!-- IMPORT partials/header/brand.tpl -->
33
+ <script>
34
+ const headerEl = document.getElementById('header-menu');
35
+ if (headerEl) {
36
+ const rect = headerEl.getBoundingClientRect();
37
+ const offset = Math.max(0, rect.bottom);
38
+ document.documentElement.style.setProperty('--panel-offset', offset + `px`);
39
+ } else {
40
+ document.documentElement.style.setProperty('--panel-offset', `0px`);
41
+ }
42
+ </script>
43
+ <div class="container-lg px-md-4 d-flex flex-column gap-3 h-100 mb-5 mb-lg-0" id="content">
44
+ <!-- IMPORT partials/noscript/warning.tpl -->
45
+ <!-- IMPORT partials/noscript/message.tpl -->
@@ -1,32 +1,32 @@
1
- <div class="notifications">
2
- <div class="btn-toolbar justify-content-end" role="toolbar">
3
- <button class="btn btn-sm btn-light" component="notifications/mark_all">[[notifications:mark-all-read]]</button>
4
- </div>
5
-
6
- <hr class="text-muted opacity-25"/>
7
-
8
- <div class="d-flex flex-column flex-md-row">
9
- <div class="flex-shrink-0 pe-2 border-end-md text-sm mb-3 flex-basis-md-200">
10
- <div class="nav sticky-top d-flex flex-row flex-md-column flex-wrap gap-1" style="z-index: 1;">
11
- {{{ each filters }}}
12
- {{{ if ./separator }}}
13
- <hr/>
14
- {{{ else }}}
15
- <a class="btn-ghost ff-secondary fw-semibold {{{ if ./selected }}}active{{{ end }}}" href="{config.relative_path}/notifications?filter={./filter}">
16
- <div class="flex-grow-1">{filters.name}</div>
17
- <span class="flex-shrink-0 text-xs" title="{./count}">{humanReadableNumber(./count)}</span>
18
- </a>
19
- {{{ end }}}
20
- {{{ end }}}
21
- </div>
22
- </div>
23
- <div class="flex-grow-1 ps-md-2 ps-lg-5">
24
- <ul component="notifications/list" class="notifications-list list-unstyled" data-nextstart="{nextStart}">
25
- <!-- IMPORT partials/notifications_list.tpl -->
26
- </ul>
27
- <!-- IMPORT partials/paginator.tpl -->
28
- </div>
29
- </div>
30
- </div>
31
-
32
-
1
+ <div class="notifications">
2
+ <div class="btn-toolbar justify-content-end" role="toolbar">
3
+ <button class="btn btn-sm btn-light" component="notifications/mark_all">[[notifications:mark-all-read]]</button>
4
+ </div>
5
+
6
+ <hr class="text-muted opacity-25"/>
7
+
8
+ <div class="d-flex flex-column flex-md-row">
9
+ <div class="flex-shrink-0 pe-2 border-end-md text-sm mb-3 flex-basis-md-200">
10
+ <div class="nav sticky-top d-flex flex-row flex-md-column flex-wrap gap-1" style="z-index: 1;">
11
+ {{{ each filters }}}
12
+ {{{ if ./separator }}}
13
+ <hr/>
14
+ {{{ else }}}
15
+ <a class="btn btn-ghost d-flex gap-2 text-start text-sm ff-secondary fw-semibold {{{ if ./selected }}}active{{{ end }}}" href="{config.relative_path}/notifications?filter={./filter}">
16
+ <div class="flex-grow-1">{filters.name}</div>
17
+ <span class="flex-shrink-0 text-xs" title="{./count}">{humanReadableNumber(./count)}</span>
18
+ </a>
19
+ {{{ end }}}
20
+ {{{ end }}}
21
+ </div>
22
+ </div>
23
+ <div class="flex-grow-1 ps-md-2 ps-lg-5">
24
+ <ul component="notifications/list" class="notifications-list list-unstyled" data-nextstart="{nextStart}">
25
+ <!-- IMPORT partials/notifications_list.tpl -->
26
+ </ul>
27
+ <!-- IMPORT partials/paginator.tpl -->
28
+ </div>
29
+ </div>
30
+ </div>
31
+
32
+
@@ -1,36 +1,36 @@
1
- <div class="btn-group bottom-sheet">
2
- <button type="button" class="btn btn-light dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
3
- <i class="fa fa-gear fa-fw"></i>
4
- </button>
5
- <ul class="dropdown-menu dropdown-menu-end p-1 text-sm account-sub-links" role="menu">
6
- <li>
7
- <a class="dropdown-item rounded-1" href="{config.relative_path}/user/{userslug}/info" role="menuitem">[[user:account-info]]</a>
8
- </li>
9
- {{{ if (canBan || canMute) }}}
10
- <li role="separator" class="dropdown-divider"></li>
11
- {{{ end }}}
12
- {{{ if canBan }}}
13
- <li class="{{{ if banned }}}hide{{{ end }}}">
14
- <a class="dropdown-item rounded-1" component="account/ban" href="#" role="menuitem">[[user:ban-account]]</a>
15
- </li>
16
- <li class="{{{ if !banned }}}hide{{{ end }}}">
17
- <a class="dropdown-item rounded-1" component="account/unban" href="#" role="menuitem">[[user:unban-account]]</a>
18
- </li>
19
- {{{ end }}}
20
- {{{ if canMute }}}
21
- <li class="{{{ if muted }}}hide{{{ end }}}">
22
- <a class="dropdown-item rounded-1" component="account/mute" href="#" role="menuitem">[[user:mute-account]]</a>
23
- </li>
24
- <li class="{{{ if !muted }}}hide{{{ end }}}">
25
- <a class="dropdown-item rounded-1" component="account/unmute" href="#" role="menuitem">[[user:unmute-account]]</a>
26
- </li>
27
- {{{ end }}}
28
- {{{ if isAdmin }}}
29
- <li>
30
- <a component="account/delete-account" href="#" class="dropdown-item rounded-1" role="menuitem">[[user:delete-account-as-admin]]</a>
31
- <a component="account/delete-content" href="#" class="dropdown-item rounded-1" role="menuitem">[[user:delete-content]]</a>
32
- <a component="account/delete-all" href="#" class="dropdown-item rounded-1" role="menuitem">[[user:delete-all]]</a>
33
- </li>
34
- {{{ end }}}
35
- </ul>
36
- </div>
1
+ <div class="btn-group bottom-sheet">
2
+ <button type="button" class="btn btn-light dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
3
+ <i class="fa fa-gear fa-fw"></i>
4
+ </button>
5
+ <ul class="dropdown-menu dropdown-menu-end p-1 text-sm account-sub-links" role="menu">
6
+ <li>
7
+ <a class="dropdown-item rounded-1" href="{config.relative_path}/user/{userslug}/info" role="menuitem">[[user:account-info]]</a>
8
+ </li>
9
+ {{{ if (canBan || canMute) }}}
10
+ <li role="separator" class="dropdown-divider"></li>
11
+ {{{ end }}}
12
+ {{{ if canBan }}}
13
+ <li class="{{{ if banned }}}hide{{{ end }}}">
14
+ <a class="dropdown-item rounded-1" component="account/ban" href="#" role="menuitem">[[user:ban-account]]</a>
15
+ </li>
16
+ <li class="{{{ if !banned }}}hide{{{ end }}}">
17
+ <a class="dropdown-item rounded-1" component="account/unban" href="#" role="menuitem">[[user:unban-account]]</a>
18
+ </li>
19
+ {{{ end }}}
20
+ {{{ if canMute }}}
21
+ <li class="{{{ if muted }}}hide{{{ end }}}">
22
+ <a class="dropdown-item rounded-1" component="account/mute" href="#" role="menuitem">[[user:mute-account]]</a>
23
+ </li>
24
+ <li class="{{{ if !muted }}}hide{{{ end }}}">
25
+ <a class="dropdown-item rounded-1" component="account/unmute" href="#" role="menuitem">[[user:unmute-account]]</a>
26
+ </li>
27
+ {{{ end }}}
28
+ {{{ if isAdmin }}}
29
+ <li>
30
+ <a component="account/delete-account" href="#" class="dropdown-item rounded-1" role="menuitem">[[user:delete-account-as-admin]]</a>
31
+ <a component="account/delete-content" href="#" class="dropdown-item rounded-1" role="menuitem">[[user:delete-content]]</a>
32
+ <a component="account/delete-all" href="#" class="dropdown-item rounded-1" role="menuitem">[[user:delete-all]]</a>
33
+ </li>
34
+ {{{ end }}}
35
+ </ul>
36
+ </div>
@@ -1,22 +1,22 @@
1
- <li component="categories/category" data-cid="{./cid}" data-parent-cid="{../parentCid}" class="category-{./cid}">
2
- <meta itemprop="name" content="{./name}">
3
- <div class="content depth-{./depth} d-flex gap-2">
4
- <div class="flex-grow-1 align-items-start d-flex gap-2">
5
- <div>
6
- {buildCategoryIcon(@value, "24px", "rounded-1")}
7
- </div>
8
- <div class="d-grid gap-0">
9
- <div class="title fw-semibold">
10
- <!-- IMPORT partials/categories/link.tpl -->
11
- </div>
12
- {{{ if ./descriptionParsed }}}
13
- <div class="description text-muted text-xs w-100">{./descriptionParsed}</div>
14
- {{{ end }}}
15
- </div>
16
- </div>
17
- <div class="flex-shrink-0">
18
- <!-- IMPORT partials/category/watch.tpl -->
19
- </div>
20
- </div>
21
- <hr />
22
- </li>
1
+ <li component="categories/category" data-cid="{./cid}" data-parent-cid="{../parentCid}" class="category-{./cid}">
2
+ <meta itemprop="name" content="{./name}">
3
+ <div class="content depth-{./depth} d-flex gap-2">
4
+ <div class="flex-grow-1 align-items-start d-flex gap-2">
5
+ <div>
6
+ {buildCategoryIcon(@value, "24px", "rounded-1")}
7
+ </div>
8
+ <div class="d-grid gap-0">
9
+ <div class="title fw-semibold">
10
+ <!-- IMPORT partials/categories/link.tpl -->
11
+ </div>
12
+ {{{ if ./descriptionParsed }}}
13
+ <div class="description text-muted text-xs w-100">{./descriptionParsed}</div>
14
+ {{{ end }}}
15
+ </div>
16
+ </div>
17
+ <div class="flex-shrink-0">
18
+ <!-- IMPORT partials/category/watch.tpl -->
19
+ </div>
20
+ </div>
21
+ <hr />
22
+ </li>
@@ -1,3 +1,3 @@
1
- </div>
2
- </div>
1
+ </div>
2
+ </div>
3
3
  </div>