nodebb-theme-harmony 1.0.0-beta.1 → 1.0.0-beta.100

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 (154) hide show
  1. package/README.md +12 -1
  2. package/languages/en-GB/harmony.json +5 -1
  3. package/library.js +25 -25
  4. package/package.json +1 -1
  5. package/plugin.json +0 -1
  6. package/public/harmony.js +163 -29
  7. package/public/settings.js +1 -0
  8. package/screenshots/categories.png +0 -0
  9. package/screenshots/recent.png +0 -0
  10. package/screenshots/topic.png +0 -0
  11. package/scss/account.scss +1 -1
  12. package/scss/chats.scss +59 -26
  13. package/scss/common.scss +84 -10
  14. package/scss/flags.scss +5 -0
  15. package/scss/groups.scss +2 -2
  16. package/scss/harmony.scss +4 -0
  17. package/scss/mixins.scss +7 -3
  18. package/scss/modals.scss +6 -1
  19. package/scss/modules/bottom-sheet.scss +2 -2
  20. package/scss/modules/composer.scss +0 -4
  21. package/scss/modules/cover.scss +1 -11
  22. package/scss/modules/filters.scss +8 -0
  23. package/scss/modules/nprogress.scss +80 -0
  24. package/scss/modules/paginator.scss +24 -0
  25. package/scss/modules/topic-navigator.scss +16 -42
  26. package/scss/modules/topics-list.scss +32 -17
  27. package/scss/modules/user-menu.scss +6 -0
  28. package/scss/overrides.scss +4 -1
  29. package/scss/sidebar.scss +61 -8
  30. package/scss/topic.scss +30 -13
  31. package/templates/account/blocks.tpl +35 -40
  32. package/templates/account/categories.tpl +47 -29
  33. package/templates/account/consent.tpl +66 -10
  34. package/templates/account/edit/password.tpl +25 -30
  35. package/templates/account/edit/username.tpl +21 -26
  36. package/templates/account/edit.tpl +105 -116
  37. package/templates/account/followers.tpl +12 -19
  38. package/templates/account/following.tpl +12 -18
  39. package/templates/account/groups.tpl +12 -17
  40. package/templates/account/info.tpl +178 -206
  41. package/templates/account/posts.tpl +31 -36
  42. package/templates/account/profile.tpl +66 -73
  43. package/templates/account/sessions.tpl +8 -30
  44. package/templates/account/settings.tpl +222 -203
  45. package/templates/account/theme.tpl +35 -26
  46. package/templates/account/topics.tpl +36 -38
  47. package/templates/account/uploads.tpl +33 -40
  48. package/templates/admin/plugins/harmony.tpl +17 -3
  49. package/templates/categories.tpl +3 -6
  50. package/templates/category.tpl +13 -14
  51. package/templates/chats.tpl +9 -10
  52. package/templates/flags/detail.tpl +160 -193
  53. package/templates/flags/list.tpl +4 -70
  54. package/templates/footer.tpl +2 -2
  55. package/templates/groups/details.tpl +22 -19
  56. package/templates/groups/list.tpl +1 -1
  57. package/templates/groups/members.tpl +0 -2
  58. package/templates/header.tpl +2 -2
  59. package/templates/login.tpl +4 -4
  60. package/templates/notifications.tpl +5 -5
  61. package/templates/partials/account/admin-menu.tpl +9 -9
  62. package/templates/partials/account/category-item.tpl +14 -17
  63. package/templates/partials/account/footer.tpl +3 -0
  64. package/templates/partials/account/header.tpl +78 -81
  65. package/templates/partials/account/session-list.tpl +18 -0
  66. package/templates/partials/account/sidebar-left.tpl +31 -25
  67. package/templates/partials/breadcrumbs.tpl +6 -6
  68. package/templates/partials/buttons/newTopic.tpl +1 -1
  69. package/templates/partials/categories/item.tpl +32 -28
  70. package/templates/partials/categories/lastpost.tpl +7 -7
  71. package/templates/partials/category/filter-dropdown-content.tpl +37 -0
  72. package/templates/partials/{category-selector-content.tpl → category/selector-dropdown-content.tpl} +7 -7
  73. package/templates/partials/category/sort.tpl +22 -7
  74. package/templates/partials/category/subcategory.tpl +2 -3
  75. package/templates/partials/category/tags.tpl +0 -2
  76. package/templates/partials/category/tools.tpl +28 -25
  77. package/templates/partials/category/watch.tpl +39 -6
  78. package/templates/partials/chats/dropdown.tpl +4 -1
  79. package/templates/partials/chats/message-window.tpl +10 -8
  80. package/templates/partials/chats/message.tpl +5 -7
  81. package/templates/partials/chats/options.tpl +14 -6
  82. package/templates/partials/chats/recent_room.tpl +41 -32
  83. package/templates/partials/cookie-consent.tpl +5 -5
  84. package/templates/partials/flags/bulk-actions.tpl +9 -0
  85. package/templates/partials/flags/filters.tpl +163 -78
  86. package/templates/partials/flags/results.tpl +38 -0
  87. package/templates/partials/groups/admin.tpl +4 -4
  88. package/templates/partials/groups/badge.tpl +1 -1
  89. package/templates/partials/groups/list.tpl +2 -2
  90. package/templates/partials/groups/memberlist.tpl +1 -1
  91. package/templates/partials/groups/sidebar-left.tpl +10 -10
  92. package/templates/partials/header/brand.tpl +9 -2
  93. package/templates/partials/mobile-footer.tpl +69 -61
  94. package/templates/partials/notifications_list.tpl +11 -8
  95. package/templates/partials/paginator.tpl +11 -9
  96. package/templates/partials/post_bar.tpl +26 -24
  97. package/templates/partials/posts_list_item.tpl +5 -5
  98. package/templates/partials/quick-search-results.tpl +3 -3
  99. package/templates/partials/search-filters.tpl +184 -0
  100. package/templates/partials/search-results.tpl +28 -35
  101. package/templates/partials/sidebar/chats.tpl +28 -36
  102. package/templates/partials/sidebar/drafts.tpl +45 -34
  103. package/templates/partials/sidebar/logged-in-menu.tpl +5 -5
  104. package/templates/partials/sidebar/logged-out-menu.tpl +1 -1
  105. package/templates/partials/sidebar/notifications.tpl +33 -12
  106. package/templates/partials/sidebar/search-mobile.tpl +1 -1
  107. package/templates/partials/sidebar/search.tpl +1 -1
  108. package/templates/partials/sidebar/user-menu.tpl +38 -29
  109. package/templates/partials/sidebar-left.tpl +14 -11
  110. package/templates/partials/sidebar-right.tpl +1 -3
  111. package/templates/partials/skin-switcher.tpl +3 -3
  112. package/templates/partials/tags/filter-dropdown-content.tpl +34 -0
  113. package/templates/partials/tags_list.tpl +4 -4
  114. package/templates/partials/topic/browsing-users.tpl +0 -2
  115. package/templates/partials/topic/event.tpl +1 -1
  116. package/templates/partials/topic/navigation-post.tpl +5 -9
  117. package/templates/partials/topic/navigator-mobile.tpl +62 -0
  118. package/templates/partials/topic/navigator.tpl +21 -17
  119. package/templates/partials/topic/post-editor.tpl +0 -2
  120. package/templates/partials/topic/post-menu-list.tpl +60 -62
  121. package/templates/partials/topic/post-menu.tpl +16 -11
  122. package/templates/partials/topic/post.tpl +43 -25
  123. package/templates/partials/topic/quickreply.tpl +7 -7
  124. package/templates/partials/topic/reply-button.tpl +3 -3
  125. package/templates/partials/topic/sort.tpl +17 -5
  126. package/templates/partials/topic/tools.tpl +2 -2
  127. package/templates/partials/topic/topic-menu-list.tpl +22 -24
  128. package/templates/partials/topic/watch.tpl +42 -9
  129. package/templates/partials/topic-filters.tpl +6 -3
  130. package/templates/partials/topic-list-bar.tpl +50 -46
  131. package/templates/partials/topic-terms.tpl +6 -3
  132. package/templates/partials/topics_list.tpl +85 -93
  133. package/templates/partials/userFilter-placeholders.tpl +5 -0
  134. package/templates/partials/users/filter-dropdown-content.tpl +23 -0
  135. package/templates/partials/users/item.tpl +25 -27
  136. package/templates/partials/users_list.tpl +1 -1
  137. package/templates/popular.tpl +3 -1
  138. package/templates/post-queue.tpl +166 -0
  139. package/templates/recent.tpl +3 -2
  140. package/templates/register.tpl +4 -4
  141. package/templates/search.tpl +39 -177
  142. package/templates/tags.tpl +3 -3
  143. package/templates/top.tpl +3 -1
  144. package/templates/topic.tpl +74 -68
  145. package/templates/unread.tpl +3 -1
  146. package/templates/users.tpl +7 -3
  147. package/templates/modules/usercard.tpl +0 -39
  148. package/templates/partials/acceptTos.tpl +0 -11
  149. package/templates/partials/category-filter-content.tpl +0 -30
  150. package/templates/partials/category-filter-right.tpl +0 -5
  151. package/templates/partials/category-filter.tpl +0 -3
  152. package/templates/partials/category-selector-right.tpl +0 -5
  153. package/templates/partials/category-selector.tpl +0 -3
  154. package/templates/partials/slideout-menu.tpl +0 -6
@@ -1,7 +1,7 @@
1
- <!-- IF privileges.topics:reply -->
2
- <div component="topic/quickreply/container" class="quick-reply d-flex gap-3">
1
+ {{{ if privileges.topics:reply }}}
2
+ <div component="topic/quickreply/container" class="quick-reply d-flex gap-3 mb-4">
3
3
  <div class="icon hidden-xs">
4
- <a class="d-inline-block position-relative" href="<!-- IF loggedInUser.userslug -->{config.relative_path}/user/{loggedInUser.userslug}<!-- ELSE -->#<!-- ENDIF loggedInUser.userslug -->">
4
+ <a class="d-inline-block position-relative" href="{{{ if loggedInUser.userslug }}}{config.relative_path}/user/{loggedInUser.userslug}{{{ else }}}#{{{ end }}}">
5
5
  {buildAvatar(loggedInUser, "48px", true, "", "user/picture")}
6
6
  {{{ if loggedInUser.status }}}<span component="user/status" class="position-absolute translate-middle-y badge border border-white border-2 rounded-circle status {loggedInUser.status}"><span class="visually-hidden">[[global:{loggedInUser.status}]]</span></span>{{{ end }}}
7
7
  </a>
@@ -9,14 +9,14 @@
9
9
  <form class="flex-grow-1 d-flex flex-column gap-2" method="post" action="{config.relative_path}/compose">
10
10
  <input type="hidden" name="tid" value="{tid}" />
11
11
  <input type="hidden" name="_csrf" value="{config.csrf_token}" />
12
- <div class="quickreply-message">
12
+ <div class="quickreply-message position-relative">
13
13
  <textarea rows="4" name="content" component="topic/quickreply/text" class="form-control mousetrap" placeholder="[[modules:composer.textarea.placeholder]]"></textarea>
14
14
  <div class="imagedrop"><div>[[topic:composer.drag_and_drop_images]]</div></div>
15
15
  </div>
16
16
  <div>
17
- <div class="btn-group">
17
+ <div class="d-flex justify-content-end gap-2">
18
+ <button type="submit" component="topic/quickreply/expand" class="btn btn-sm btn-outline" formmethod="get"><i class="fa fa-expand"></i></button>
18
19
  <button type="submit" component="topic/quickreply/button" class="btn btn-sm btn-primary">[[topic:post-quick-reply]]</button>
19
- <button type="submit" component="topic/quickreply/expand" class="btn btn-sm btn-primary" formmethod="get"><i class="fa fa-expand"></i></button>
20
20
  </div>
21
21
  </div>
22
22
  </form>
@@ -25,4 +25,4 @@
25
25
  </form>
26
26
 
27
27
  </div>
28
- <!-- ENDIF privileges.topics:reply -->
28
+ {{{ end }}}
@@ -1,10 +1,10 @@
1
- <div component="topic/reply/container" class="btn-group action-bar bottom-sheet {{{ if !privileges.topics:reply }}}hidden{{{ end }}}">
1
+ <div component="topic/reply/container" class="btn-group action-bar {{{ if !privileges.topics:reply }}}hidden{{{ end }}}">
2
2
  <a href="{config.relative_path}/compose?tid={tid}&title={title}" class="d-flex align-items-center btn btn-sm btn-primary px-3 fw-semibold " component="topic/reply" data-ajaxify="false" role="button"><i class="fa fa-reply d-sm-block d-md-none"></i><span class="d-none d-md-block"> [[topic:reply]]</span></a>
3
3
  <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-bs-toggle="dropdown">
4
4
  <span class="caret"></span>
5
5
  </button>
6
- <ul class="dropdown-menu dropdown-menu-end" role="menu">
7
- <li><a class="dropdown-item" href="#" component="topic/reply-as-topic">[[topic:reply-as-topic]]</a></li>
6
+ <ul class="dropdown-menu dropdown-menu-end p-1 text-sm" role="menu">
7
+ <li><a class="dropdown-item rounded-1" href="#" component="topic/reply-as-topic">[[topic:reply-as-topic]]</a></li>
8
8
  </ul>
9
9
  </div>
10
10
 
@@ -1,13 +1,25 @@
1
1
  <div class="btn-group bottom-sheet" component="thread/sort">
2
- <button class="btn-ghost-sm d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown" type="button">
2
+ <button class="btn-ghost-sm d-flex gap-2 dropdown-toggle" data-bs-toggle="dropdown" type="button">
3
3
  <span class="d-flex gap-2 align-items-center">
4
4
  <i class="fa fa-fw fa-arrow-down-wide-short text-primary"></i>
5
5
  <span class="d-none d-md-inline fw-semibold">[[topic:sort_by]]</span>
6
6
  </span>
7
7
  </button>
8
- <ul class="dropdown-menu">
9
- <li><a class="dropdown-item" href="#" class="oldest_to_newest" data-sort="oldest_to_newest"><i class="fa fa-fw"></i> [[topic:oldest_to_newest]]</a></li>
10
- <li><a class="dropdown-item" href="#" class="newest_to_oldest" data-sort="newest_to_oldest"><i class="fa fa-fw"></i> [[topic:newest_to_oldest]]</a></li>
11
- <li><a class="dropdown-item" href="#" class="most_votes" data-sort="most_votes"><i class="fa fa-fw"></i> [[topic:most_votes]]</a></li>
8
+ <ul class="dropdown-menu p-1 text-sm">
9
+ <li><a class="dropdown-item rounded-1 d-flex align-items-center gap-2" href="#" class="oldest_to_newest" data-sort="oldest_to_newest">
10
+ <span class="flex-grow-1">[[topic:oldest_to_newest]]</span>
11
+ <i class="flex-shrink-0 fa fa-fw"></i>
12
+ </a>
13
+ </li>
14
+ <li><a class="dropdown-item rounded-1 d-flex align-items-center gap-2" href="#" class="newest_to_oldest" data-sort="newest_to_oldest">
15
+ <span class="flex-grow-1">[[topic:newest_to_oldest]]</span>
16
+ <i class="flex-shrink-0 fa fa-fw"></i>
17
+ </a>
18
+ </li>
19
+ <li><a class="dropdown-item rounded-1 d-flex align-items-center gap-2" href="#" class="most_votes" data-sort="most_votes">
20
+ <span class="flex-grow-1">[[topic:most_votes]]</span>
21
+ <i class="flex-shrink-0 fa fa-fw"></i>
22
+ </a>
23
+ </li>
12
24
  </ul>
13
25
  </div>
@@ -1,10 +1,10 @@
1
1
  {{{ if privileges.view_thread_tools }}}
2
2
  <div class="btn-group thread-tools bottom-sheet">
3
- <button class="btn-ghost-sm d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown" type="button">
3
+ <button class="btn-ghost-sm d-flex gap-2 dropdown-toggle" data-bs-toggle="dropdown" type="button">
4
4
  <i class="fa fa-fw fa-gear link-primary"></i>
5
5
  <span class="d-none d-md-inline fw-semibold">[[topic:thread_tools.title]]</span>
6
6
  </button>
7
- <ul class="dropdown-menu">
7
+ <ul class="dropdown-menu p-1 text-sm">
8
8
  <li class="placeholder-wave"><a class="dropdown-item d-flex gap-2" href="#"><div class="placeholder bg-secondary rounded-1" style="width: 1em;"></div><div class="placeholder bg-secondary rounded-1 col-8"></div></a></li>
9
9
  <li class="placeholder-wave"><a class="dropdown-item d-flex gap-2" href="#"><div class="placeholder bg-secondary rounded-1" style="width: 1em;"></div><div class="placeholder bg-secondary rounded-1 col-8"></div></a></li>
10
10
  <li class="placeholder-wave"><a class="dropdown-item d-flex gap-2" href="#"><div class="placeholder bg-secondary rounded-1" style="width: 1em;"></div><div class="placeholder bg-secondary rounded-1 col-8"></div></a></li>
@@ -1,34 +1,32 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  {{{ if privileges.editable }}}
4
- <li <!-- IF locked -->hidden<!-- ENDIF locked -->><a component="topic/lock" href="#" class="dropdown-item <!-- IF locked -->hidden<!-- ENDIF locked -->"><i class="fa fa-fw fa-lock"></i> [[topic:thread_tools.lock]]</a></li>
5
- <li <!-- IF !locked -->hidden<!-- ENDIF !locked -->><a component="topic/unlock" href="#" class="dropdown-item <!-- IF !locked -->hidden<!-- ENDIF !locked -->"><i class="fa fa-fw fa-unlock"></i> [[topic:thread_tools.unlock]]</a></li>
6
- <li <!-- IF pinned -->hidden<!-- ENDIF pinned -->><a component="topic/pin" href="#" class="dropdown-item <!-- IF pinned -->hidden<!-- ENDIF pinned -->"><i class="fa fa-fw fa-thumb-tack"></i> [[topic:thread_tools.pin]]</a></li>
7
- <li <!-- IF !pinned -->hidden<!-- ENDIF !pinned -->><a component="topic/unpin" href="#" class="dropdown-item <!-- IF !pinned -->hidden<!-- ENDIF !pinned -->"><i class="fa fa-fw fa-thumb-tack fa-rotate-90"></i> [[topic:thread_tools.unpin]]</a></li>
2
+ <li {{{ if locked }}}hidden{{{ end }}}><a component="topic/lock" href="#" class="dropdown-item rounded-1 d-flex align-items-center gap-2 {{{ if locked }}}hidden{{{ end }}}"><i class="fa fa-fw text-muted fa-lock"></i> [[topic:thread_tools.lock]]</a></li>
3
+ <li {{{ if !locked }}}hidden{{{ end }}}><a component="topic/unlock" href="#" class="dropdown-item rounded-1 d-flex align-items-center gap-2 {{{ if !locked }}}hidden{{{ end }}}"><i class="fa fa-fw text-muted fa-unlock"></i> [[topic:thread_tools.unlock]]</a></li>
4
+ <li {{{ if pinned }}}hidden{{{ end }}}><a component="topic/pin" href="#" class="dropdown-item rounded-1 d-flex align-items-center gap-2 {{{ if pinned }}}hidden{{{ end }}}"><i class="fa fa-fw text-muted fa-thumb-tack"></i> [[topic:thread_tools.pin]]</a></li>
5
+ <li {{{ if !pinned }}}hidden{{{ end }}}><a component="topic/unpin" href="#" class="dropdown-item rounded-1 d-flex align-items-center gap-2 {{{ if !pinned }}}hidden{{{ end }}}"><i class="fa fa-fw text-muted fa-thumb-tack fa-rotate-90"></i> [[topic:thread_tools.unpin]]</a></li>
8
6
 
9
- <li><a component="topic/move" class="dropdown-item" href="#"><i class="fa fa-fw fa-arrows"></i> [[topic:thread_tools.move]]</a></li>
10
- <li><a component="topic/merge" class="dropdown-item" href="#"><i class="fa fa-fw fa-code-fork"></i> [[topic:thread_tools.merge]]</a></li>
11
- <li><a component="topic/fork" class="dropdown-item" href="#"><i class="fa fa-fw fa-code-fork"></i> [[topic:thread_tools.fork]]</a></li>
7
+ <li><a component="topic/move" class="dropdown-item rounded-1 d-flex align-items-center gap-2" href="#"><i class="fa fa-fw text-muted fa-arrows"></i> [[topic:thread_tools.move]]</a></li>
8
+ <li><a component="topic/merge" class="dropdown-item rounded-1 d-flex align-items-center gap-2" href="#"><i class="fa fa-fw text-muted fa-code-fork"></i> [[topic:thread_tools.merge]]</a></li>
9
+ <li><a component="topic/fork" class="dropdown-item rounded-1 d-flex align-items-center gap-2" href="#"><i class="fa fa-fw text-muted fa-code-fork"></i> [[topic:thread_tools.fork]]</a></li>
12
10
  {{{ if !scheduled }}}
13
- <li><a component="topic/move-posts" class="dropdown-item" href="#"><i class="fa fa-fw fa-arrows"></i> [[topic:thread_tools.move-posts]]</a></li>
11
+ <li><a component="topic/move-posts" class="dropdown-item rounded-1 d-flex align-items-center gap-2" href="#"><i class="fa fa-fw text-muted fa-arrows"></i> [[topic:thread_tools.move-posts]]</a></li>
14
12
  {{{ end }}}
15
- <li><a component="topic/mark-unread-for-all" class="dropdown-item" href="#"><i class="fa fa-fw fa-inbox"></i> [[topic:thread_tools.markAsUnreadForAll]]</a></li>
13
+ <li><a component="topic/mark-unread-for-all" class="dropdown-item rounded-1 d-flex align-items-center gap-2" href="#"><i class="fa fa-fw text-muted fa-inbox"></i> [[topic:thread_tools.markAsUnreadForAll]]</a></li>
16
14
  <li class="dropdown-divider"></li>
17
15
  {{{ end }}}
18
16
 
19
- <!-- IF privileges.deletable -->
20
- <li <!-- IF deleted -->hidden<!-- ENDIF deleted -->><a component="topic/delete" href="#" class="dropdown-item <!-- IF deleted -->hidden<!-- ENDIF deleted -->"><i class="fa fa-fw fa-trash-o"></i> [[topic:thread_tools.delete]]</a></li>
17
+ {{{ if privileges.deletable }}}
18
+ <li {{{ if deleted }}}hidden{{{ end }}}><a component="topic/delete" href="#" class="dropdown-item rounded-1 d-flex align-items-center gap-2 {{{ if deleted }}}hidden{{{ end }}}"><i class="fa fa-fw text-muted fa-trash-o"></i> [[topic:thread_tools.delete]]</a></li>
21
19
  {{{ if !scheduled }}}
22
- <li <!-- IF !deleted -->hidden<!-- ENDIF !deleted -->><a component="topic/restore" href="#" class="dropdown-item <!-- IF !deleted -->hidden<!-- ENDIF !deleted -->"><i class="fa fa-fw fa-history"></i> [[topic:thread_tools.restore]]</a></li>
20
+ <li {{{ if !deleted }}}hidden{{{ end }}}><a component="topic/restore" href="#" class="dropdown-item rounded-1 d-flex align-items-center gap-2 {{{ if !deleted }}}hidden{{{ end }}}"><i class="fa fa-fw text-muted fa-history"></i> [[topic:thread_tools.restore]]</a></li>
21
+ {{{ end }}}
22
+ {{{ if privileges.purge }}}
23
+ <li {{{ if !deleted }}}hidden{{{ end }}}><a component="topic/purge" href="#" class="dropdown-item rounded-1 d-flex align-items-center gap-2 {{{ if !deleted }}}hidden{{{ end }}}"><i class="fa fa-fw text-muted fa-eraser"></i> [[topic:thread_tools.purge]]</a></li>
24
+ {{{ end }}}
25
+ {{{ if privileges.isAdminOrMod }}}
26
+ <li><a component="topic/delete/posts" class="dropdown-item rounded-1 d-flex align-items-center gap-2" href="#"><i class="fa fa-fw text-muted fa-trash-o"></i> [[topic:thread_tools.delete-posts]]</a></li>
23
27
  {{{ end }}}
24
- <!-- IF privileges.purge -->
25
- <li <!-- IF !deleted -->hidden<!-- ENDIF !deleted -->><a component="topic/purge" href="#" class="dropdown-item <!-- IF !deleted -->hidden<!-- ENDIF !deleted -->"><i class="fa fa-fw fa-eraser"></i> [[topic:thread_tools.purge]]</a></li>
26
- <!-- END -->
27
- <!-- IF privileges.isAdminOrMod -->
28
- <li><a component="topic/delete/posts" class="dropdown-item" href="#"><i class="fa fa-fw fa-trash-o"></i> [[topic:thread_tools.delete-posts]]</a></li>
29
- <!-- ENDIF privileges.isAdminOrMod -->
30
28
 
31
- {{{each thread_tools}}}
32
- <li><a href="#" class="dropdown-item {thread_tools.class}"><i class="fa fa-fw {thread_tools.icon}"></i> {thread_tools.title}</a></li>
33
- {{{end}}}
34
- <!-- ENDIF privileges.deletable -->
29
+ {{{ each thread_tools }}}
30
+ <li><a href="#" class="dropdown-item rounded-1 d-flex align-items-center gap-2 {./class}"><i class="fa fa-fw text-muted {./icon}"></i> {./title}</a></li>
31
+ {{{ end }}}
32
+ {{{ end }}}
@@ -1,27 +1,60 @@
1
1
  {{{ if config.loggedIn }}}
2
- <div class="btn-group topic-watch-dropdown bottom-sheet" component="topic/watch">
3
- <button class="btn-ghost-sm d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown" type="button">
2
+ <div class="btn-group bottom-sheet" component="topic/watch">
3
+ <button class="btn-ghost-sm d-flex gap-2 dropdown-toggle" data-bs-toggle="dropdown" type="button">
4
4
  <span component="topic/following/menu" class="d-flex gap-2 align-items-center{{{ if !isFollowing }}} hidden{{{ end }}}">
5
- <i class="fa fa-fw fa-bell-o link-primary"></i>
5
+ <i class="flex-shrink-0 fa fa-fw fa-bell-o link-primary"></i>
6
6
  <span class="d-none d-md-inline fw-semibold">[[topic:watching]]</span>
7
7
  </span>
8
8
 
9
9
  <span component="topic/not-following/menu" class="d-flex gap-2 align-items-center{{{ if !isNotFollowing}}} hidden{{{ end }}}">
10
- <i class="fa fa-fw fa-bell-slash-o link-primary"></i>
10
+ <i class="flex-shrink-0 fa fa-fw fa-bell-slash-o link-primary"></i>
11
11
  <span class="d-none d-md-inline fw-semibold">[[topic:not-watching]]</span>
12
12
  </span>
13
13
 
14
14
  <span component="topic/ignoring/menu" class="d-flex gap-2 align-items-center{{{ if !isIgnoring }}} hidden{{{ end }}}">
15
- <i class="fa fa-fw fa-eye-slash link-primary"></i>
15
+ <i class="flex-shrink-0 fa fa-fw fa-eye-slash link-primary"></i>
16
16
  <span class="d-none d-md-inline fw-semibold">[[topic:ignoring]]</span>
17
17
  </span>
18
18
  </button>
19
- <ul class="dropdown-menu">
20
- <li><a class="dropdown-item" href="#" component="topic/following"><i component="topic/following/check" class="fa fa-fw {{{ if isFollowing }}}fa-check{{{ end }}}"></i><i class="fa fa-fw fa-bell-o"></i> [[topic:watching]]<p class="help-text text-muted"><small>[[topic:watching.description]]</small></p></a></li>
19
+ <ul class="dropdown-menu p-1 text-sm">
20
+ <li>
21
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2 p-2" href="#" component="topic/following">
22
+ <div class="flex-grow-1 d-flex flex-column">
23
+ <span class="d-flex align-items-center gap-2">
24
+ <i class="flex-shrink-0 fa fa-fw fa-bell-o"></i>
25
+ <span class="flex-grow-1 fw-semibold">[[topic:watching]]</span>
26
+ </span>
27
+ <div class="help-text text-muted text-xs">[[topic:watching.description]]</div>
28
+ </div>
29
+ <span class="flex-shrink-0"><i component="topic/following/check" class="fa fa-fw {{{ if isFollowing }}}fa-check{{{ end }}}"></i></span>
30
+ </a>
31
+ </li>
21
32
 
22
- <li><a class="dropdown-item" href="#" component="topic/not-following"><i component="topic/not-following/check" class="fa fa-fw {{{ if isNotFollowing }}}fa-check{{{ end }}}"></i><i class="fa fa-fw fa-bell-slash-o"></i> [[topic:not-watching]]<p class="help-text text-muted"><small>[[topic:not-watching.description]]</small></p></a></li>
33
+ <li>
34
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2 p-2" href="#" component="topic/not-following">
35
+ <div class="flex-grow-1 d-flex flex-column">
36
+ <span class="d-flex align-items-center gap-2">
37
+ <i class="flex-shrink-0 fa fa-fw fa-bell-slash-o"></i>
38
+ <span class="flex-grow-1 fw-semibold">[[topic:not-watching]]</span>
39
+ </span>
40
+ <div class="help-text text-muted text-xs">[[topic:not-watching.description]]</div>
41
+ </div>
42
+ <span class="flex-shrink-0"><i component="topic/not-following/check" class="fa fa-fw {{{ if isNotFollowing }}}fa-check{{{ end }}}"></i></span>
43
+ </a>
44
+ </li>
23
45
 
24
- <li><a class="dropdown-item" href="#" component="topic/ignoring"><i component="topic/ignoring/check" class="fa fa-fw {{{ if isIgnoring }}}fa-check{{{ end }}}"></i><i class="fa fa-fw fa-eye-slash"></i> [[topic:ignoring]]<p class="help-text text-muted"><small>[[topic:ignoring.description]]</small></p></a></li>
46
+ <li>
47
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2 p-2" href="#" component="topic/ignoring">
48
+ <div class="flex-grow-1 d-flex flex-column">
49
+ <span class="d-flex align-items-center gap-2">
50
+ <i class="flex-shrink-0 fa fa-fw fa-eye-slash"></i>
51
+ <span class="flex-grow-1 fw-semibold">[[topic:ignoring]]</span>
52
+ </span>
53
+ <div class="help-text text-muted text-xs">[[topic:ignoring.description]]</div>
54
+ </div>
55
+ <span class="flex-shrink-0"><i component="topic/ignoring/check" class="fa fa-fw {{{ if isIgnoring }}}fa-check{{{ end }}}"></i></span>
56
+ </a>
57
+ </li>
25
58
  </ul>
26
59
  </div>
27
60
  {{{ end }}}
@@ -1,12 +1,15 @@
1
1
  <div class="btn-group bottom-sheet{{{ if !filters.length }}} hidden{{{ end }}}">
2
- <button type="button" class="btn-ghost-sm d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown">
2
+ <button type="button" class="btn-ghost-sm d-flex gap-2 dropdown-toggle" data-bs-toggle="dropdown">
3
3
  <i class="fa fa-fw fa-filter link-primary"></i>
4
4
  <span class="visible-md-inline visible-lg-inline fw-semibold">{selectedFilter.name}</span>
5
5
  </button>
6
- <ul class="dropdown-menu" role="menu">
6
+ <ul class="dropdown-menu p-1 text-sm" role="menu">
7
7
  {{{each filters}}}
8
8
  <li role="presentation" class="category {{{if filters.selected}}}selected{{{end}}}">
9
- <a class="dropdown-item" role="menu-item" href="{config.relative_path}/{filters.url}"><i class="fa fa-fw {{{ if filters.selected }}}fa-check{{{ end }}}"></i>{filters.name}</a>
9
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" role="menu-item" href="{config.relative_path}/{filters.url}">
10
+ <div class="flex-grow-1">{filters.name}</div>
11
+ <i class="flex-shrink-0 fa fa-fw {{{ if filters.selected }}}fa-check{{{ end }}}"></i>
12
+ </a>
10
13
  </li>
11
14
  {{{end}}}
12
15
  </ul>
@@ -1,50 +1,54 @@
1
- <nav class="topic-list-header {{{ if config.stickyToolbar }}} sticky-tools{{{ end }}} navbar navbar-expand p-0 border-0 rounded">
2
- <div class="card card-header flex-row p-2 border rounded ff-secondary w-100">
3
- <ul class="navbar-nav me-auto gap-2 align-items-center">
4
- {{{ if template.category }}}
5
- <!-- IMPORT partials/category/watch.tpl -->
6
- <!-- IMPORT partials/category/sort.tpl -->
7
- {{{ end }}}
8
- {{{ if (template.popular || template.top)}}}
9
- <!-- IMPORT partials/topic-terms.tpl -->
10
- {{{ end }}}
11
- {{{ if (template.unread || (template.recent || (template.popular || template.top))) }}}
12
- <!-- IMPORT partials/topic-filters.tpl -->
13
- <!-- IMPORT partials/category-filter.tpl -->
14
- {{{ end }}}
15
- {{{ if template.unread }}}
16
- <div class="markread btn-group {{{ if !topics.length }}}hidden{{{ end }}}">
17
- <!-- IMPORT partials/category-selector.tpl -->
18
- </div>
19
- {{{ end }}}
20
- {{{ if template.tag }}}
21
- <!-- IMPORT partials/category-filter.tpl -->
22
- {{{ end }}}
23
- <!-- IMPORT partials/category/tools.tpl -->
1
+ <div class="{{{ if config.theme.stickyToolbar }}}sticky-tools{{{ end }}} mb-3">
2
+ <nav class="topic-list-header navbar navbar-expand p-0 border-0 rounded">
3
+ <div class="card card-header flex-row p-2 gap-1 border rounded w-100 align-items-center">
4
+ <ul component="category/controls" class="navbar-nav me-auto gap-2 align-items-start flex-wrap">
5
+ {{{ if template.category }}}
6
+ <!-- IMPORT partials/category/watch.tpl -->
7
+ <!-- IMPORT partials/tags/filter-dropdown-left.tpl -->
8
+ <!-- IMPORT partials/category/sort.tpl -->
9
+ {{{ end }}}
10
+ {{{ if (template.popular || template.top)}}}
11
+ <!-- IMPORT partials/topic-terms.tpl -->
12
+ {{{ end }}}
13
+ {{{ if (template.unread || (template.recent || (template.popular || template.top))) }}}
14
+ <!-- IMPORT partials/topic-filters.tpl -->
15
+ <!-- IMPORT partials/category/filter-dropdown-left.tpl -->
16
+ <!-- IMPORT partials/tags/filter-dropdown-left.tpl -->
17
+ {{{ end }}}
18
+ {{{ if template.unread }}}
19
+ <div class="markread btn-group {{{ if !topics.length }}}hidden{{{ end }}}">
20
+ <!-- IMPORT partials/category/selector-dropdown-left.tpl -->
21
+ </div>
22
+ {{{ end }}}
23
+ {{{ if template.tag }}}
24
+ <!-- IMPORT partials/category/filter-dropdown-left.tpl -->
25
+ {{{ end }}}
26
+ <!-- IMPORT partials/category/tools.tpl -->
24
27
 
25
- {{{ if (!feeds:disableRSS && rssFeedUrl) }}}
26
- <a class="btn-ghost-sm d-none d-lg-flex align-self-stretch" target="_blank" href="{rssFeedUrl}" itemprop="item"><i class="fa fa-rss text-primary"></i></a>
27
- {{{ end }}}
28
+ {{{ if (!feeds:disableRSS && rssFeedUrl) }}}
29
+ <a class="btn-ghost-sm d-none d-lg-flex align-self-stretch" target="_blank" href="{rssFeedUrl}" itemprop="item"><i class="fa fa-rss text-primary"></i></a>
30
+ {{{ end }}}
28
31
 
29
- <a href="{config.relative_path}{{{ if template.category }}}{url}{{{ else }}}/{selectedFilter.url}{querystring}{{{ end }}}" class="d-inline-block text-decoration-none">
30
- <div class="alert alert-warning h-100 m-0 px-2 py-1 d-flex align-items-center hide" id="new-topics-alert"></div>
31
- </a>
32
- </ul>
32
+ <a href="{config.relative_path}{{{ if template.category }}}{url}{{{ else }}}/{selectedFilter.url}{querystring}{{{ end }}}" class="btn btn-secondary fw-semibold position-absolute top-100 translate-middle-x start-50 mt-1 hide" style="--bs-btn-padding-y: .25rem; --bs-btn-padding-x: .5rem; --bs-btn-font-size: .75rem;" id="new-topics-alert">
33
+ <i class="fa fa-fw fa-arrow-up"></i> [[recent:load-new-posts]]
34
+ </a>
35
+ </ul>
33
36
 
34
- <div class="d-flex gap-1 align-items-stretch">
35
- {{{ if template.category }}}
36
- {{{ if privileges.topics:create }}}
37
- <a href="{config.relative_path}/compose?cid={cid}" component="category/post" id="new_topic" class="btn btn-primary btn-sm text-nowrap" data-ajaxify="false" role="button">[[category:new_topic_button]]</a>
38
- {{{ end }}}
39
- {{{ else }}}
40
- {{{ if canPost }}}
41
- <!-- IMPORT partials/buttons/newTopic.tpl -->
42
- {{{ end }}}
43
- {{{ end }}}
44
- <!-- only show login button if not logged in and doesn't have any posting privilege -->
45
- {{{ if (!loggedIn && (!privileges.topics:create && !canPost))}}}
46
- <a component="category/post/guest" href="{config.relative_path}/login" class="btn btn-primary">[[category:guest-login-post]]</a>
47
- {{{ end }}}
37
+ <div class="d-flex gap-1 align-items-center">
38
+ {{{ if template.category }}}
39
+ {{{ if privileges.topics:create }}}
40
+ <a href="{config.relative_path}/compose?cid={cid}" component="category/post" id="new_topic" class="btn btn-primary btn-sm text-nowrap" data-ajaxify="false" role="button">[[category:new_topic_button]]</a>
41
+ {{{ end }}}
42
+ {{{ else }}}
43
+ {{{ if canPost }}}
44
+ <!-- IMPORT partials/buttons/newTopic.tpl -->
45
+ {{{ end }}}
46
+ {{{ end }}}
47
+ <!-- only show login button if not logged in and doesn't have any posting privilege -->
48
+ {{{ if (!loggedIn && (!privileges.topics:create && !canPost))}}}
49
+ <a component="category/post/guest" href="{config.relative_path}/login" class="btn btn-primary">[[category:guest-login-post]]</a>
50
+ {{{ end }}}
51
+ </div>
48
52
  </div>
49
- </div>
50
- </nav>
53
+ </nav>
54
+ </div>
@@ -1,12 +1,15 @@
1
1
  <div class="btn-group bottom-sheet {{{ if !terms.length }}}hidden{{{ end }}}">
2
- <button type="button" class="btn-ghost-sm d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown">
2
+ <button type="button" class="btn-ghost-sm d-flex gap-2 dropdown-toggle" data-bs-toggle="dropdown">
3
3
  <i class="fa fa-fw fa-clock text-primary"></i>
4
4
  <span class="visible-md-inline visible-lg-inline fw-semibold">{selectedTerm.name}</span>
5
5
  </button>
6
- <ul class="dropdown-menu" role="menu">
6
+ <ul class="dropdown-menu p-1 text-sm" role="menu">
7
7
  {{{each terms}}}
8
8
  <li role="presentation" class="category">
9
- <a class="dropdown-item" role="menu-item" href="{config.relative_path}/{terms.url}"><i class="fa fa-fw {{{ if terms.selected }}}fa-check{{{ end }}}"></i>{terms.name}</a>
9
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" role="menu-item" href="{config.relative_path}/{terms.url}">
10
+ <div class="flex-grow-1">{terms.name}</div>
11
+ <i class="flex-shrink-0 fa fa-fw {{{ if terms.selected }}}fa-check{{{ end }}}"></i>
12
+ </a>
10
13
  </li>
11
14
  {{{end}}}
12
15
  </ul>
@@ -1,127 +1,119 @@
1
- <ul component="category" class="list-unstyled topic-list pt-4 overflow-auto position-relative" itemscope itemtype="http://www.schema.org/ItemList" data-nextstart="{nextStart}" data-set="{set}">
1
+ <ul component="category" class="topics-list list-unstyled" itemscope itemtype="http://www.schema.org/ItemList" data-nextstart="{nextStart}" data-set="{set}">
2
2
 
3
3
  {{{ each topics }}}
4
- <li component="category/topic" class="category-item position-relative {function.generateTopicClass}" <!-- IMPORT partials/data/category.tpl -->>
4
+ <li component="category/topic" class="category-item position-relative w-100 border-bottom py-3 py-lg-4 gap-1 d-flex flex-column flex-lg-row align-items-start {function.generateTopicClass}" <!-- IMPORT partials/data/category.tpl -->>
5
5
  <link itemprop="url" content="{config.relative_path}/topic/{./slug}" />
6
6
  <meta itemprop="name" content="{function.stripTags, ./title}" />
7
7
  <meta itemprop="itemListOrder" content="descending" />
8
8
  <meta itemprop="position" content="{./index}" />
9
- <a id="{./index}" data-index="{./index}" component="topic/anchor"></a>
9
+ <a id="{./index}" data-index="{./index}" component="topic/anchor" class="position-absolute"></a>
10
10
 
11
- <div class="row">
12
- <div class="col-md-7 col-sm-9 col-12 content d-flex">
13
- <div class="me-3">
14
- <div class="avatar">
15
- <a href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" class="text-decoration-none">
16
- {{{ if ./thumbs.length }}}
17
- <img src="{./thumbs.0.url}" class="not-responsive" />
18
- {{{ else }}}
19
- {buildAvatar(./user, "40px", true, "not-responsive")}
20
- {{{ end }}}
21
- </a>
22
- </div>
23
- </div>
24
- <div class="d-flex flex-column gap-1">
25
- <h2 component="topic/header" class="title mb-1 {{{ if showSelect }}}me-4{{{ end }}} me-md-0 text-md fw-bold">
26
- {{{ if topics.noAnchor }}}
27
- <span>{./title}</span>
28
- {{{ else }}}
29
- <a class="text-reset" href="{config.relative_path}/topic/{./slug}{{{ if ./bookmark }}}/{./bookmark}{{{ end }}}">{./title}</a>
30
- {{{ end }}}
31
- </h2>
32
- <div class="info d-flex align-items-center flex-wrap">
33
- <span component="topic/labels" class="d-flex mb-1">
34
- <span component="topic/scheduled" class="me-2 badge border border-gray-300 text-primary {{{ if !./scheduled }}}hidden{{{ end }}}">
35
- <i class="fa fa-clock-o"></i>
36
- [[topic:scheduled]]
37
- </span>
38
- <span component="topic/pinned" class="me-2 badge border border-gray-300 text-primary {{{ if (./scheduled || !./pinned) }}}hidden{{{ end }}}">
39
- <i class="fa fa-thumb-tack"></i>
40
- {{{ if !./pinExpiry }}}[[topic:pinned]]{{{ else }}}[[topic:pinned-with-expiry, {./pinExpiryISO}]]{{{ end }}}
41
- </span>
42
- <span component="topic/locked" class="me-2 badge border border-gray-300 text-primary {{{ if !./locked }}}hidden{{{ end }}}">
43
- <i class="fa fa-lock"></i>
44
- [[topic:locked]]
45
- </span>
46
- <span class="me-2 badge border border-gray-300 text-primary {{{ if !./oldCid }}}hidden{{{ end }}}">
47
- <i class="fa fa-arrow-circle-right"></i>
48
- [[topic:moved]]
49
- </span>
50
- {{{each ./icons}}}<span class="me-2">{@value}</span>{{{end}}}
51
- </span>
52
11
 
53
-
54
- {{{ if !template.category }}}
55
- <a class="lh-1 me-2 mb-1" href="{config.relative_path}/category/{./category.slug}">{function.buildCategoryLabel, ./category, "border"}</a>
56
- {{{ end }}}
57
-
58
- {{{ if ./tags.length }}}
59
- <span class="lh-1 tag-list hidden-xs d-flex flex-wrap gap-2 me-2 mb-1 ">
60
- {{{ each ./tags }}}
61
- <a href="{config.relative_path}/tags/{./valueEncoded}"><span class="badge border border-gray-300 text-xs fw-normal tag tag-class-{./class}" data-tag="{./value}">{./valueEscaped}</span></a>
62
- {{{ end }}}
63
- </span>
64
- {{{ end }}}
65
-
66
- <span class="hidden-xs text-xs timeago text-muted me-2 mb-1" title="{./timestampISO}"></span>
67
-
68
- <span class="visible-xs-inline timeago text-muted text-xs" title="{{{ if ./teaser.timestampISO }}}{./teaser.timestampISO}{{{ else }}}{./timestampISO}{{{ end }}}"></span>
69
- </div>
12
+ <div class="d-flex p-0 col-lg-7 gap-2 gap-lg-3 align-items-start">
13
+ <div class="flex-shrink-0 position-relative">
14
+ <a class="text-decoration-none" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">
15
+ {buildAvatar(./user, "40px", true, "avatar avatar-tooltip")}
16
+ </a>
17
+ {{{ if showSelect }}}
18
+ <div class="checkbox position-absolute top-100 start-50 translate-middle-x p-1 m-0 d-none d-lg-flex" style="max-width:max-content">
19
+ <i component="topic/select" class="fa text-muted pointer fa-square-o"></i>
70
20
  </div>
21
+ {{{ end }}}
22
+ </div>
23
+ <div class="flex-grow-1 d-flex flex-wrap gap-1">
24
+ <h3 component="topic/header" class="title text-break fs-5 fw-semibold m-0 tracking-tight w-100 {{{ if showSelect }}}me-4 me-lg-0{{{ end }}}">
25
+ {{{ if topics.noAnchor }}}
26
+ <span>{./title}</span>
27
+ {{{ else }}}
28
+ <a class="text-reset" href="{config.relative_path}/topic/{./slug}{{{ if ./bookmark }}}/{./bookmark}{{{ end }}}">{./title}</a>
29
+ {{{ end }}}
30
+ </h3>
31
+ <span component="topic/labels" class="d-flex flex-wrap gap-1">
32
+ <span component="topic/scheduled" class="badge border border-gray-300 text-primary {{{ if !./scheduled }}}hidden{{{ end }}}">
33
+ <i class="fa fa-clock-o"></i>
34
+ [[topic:scheduled]]
35
+ </span>
36
+ <span component="topic/pinned" class="badge border border-gray-300 text-primary {{{ if (./scheduled || !./pinned) }}}hidden{{{ end }}}">
37
+ <i class="fa fa-thumb-tack"></i>
38
+ {{{ if !./pinExpiry }}}[[topic:pinned]]{{{ else }}}[[topic:pinned-with-expiry, {./pinExpiryISO}]]{{{ end }}}
39
+ </span>
40
+ <span component="topic/locked" class="badge border border-gray-300 text-primary {{{ if !./locked }}}hidden{{{ end }}}">
41
+ <i class="fa fa-lock"></i>
42
+ [[topic:locked]]
43
+ </span>
44
+ <span class="badge border border-gray-300 text-primary {{{ if !./oldCid }}}hidden{{{ end }}}">
45
+ <i class="fa fa-arrow-circle-right"></i>
46
+ [[topic:moved]]
47
+ </span>
48
+ {{{each ./icons}}}<span class="lh-1">{@value}</span>{{{end}}}
49
+ {{{ if !template.category }}}
50
+ <a class="lh-1" href="{config.relative_path}/category/{./category.slug}">{function.buildCategoryLabel, ./category, "border"}</a>
51
+ {{{ end }}}
52
+ {{{ if ./tags.length }}}
53
+ <span class="lh-1 tag-list hidden-xs d-flex flex-wrap gap-1">
54
+ {{{ each ./tags }}}
55
+ <a href="{config.relative_path}/tags/{./valueEncoded}"><span class="badge border border-gray-300 text-muted fw-normal tag tag-class-{./class}" data-tag="{./value}">{./valueEscaped}</span></a>
56
+ {{{ end }}}
57
+ </span>
58
+ {{{ end }}}
59
+ <span class="hidden-xs badge bg-transparent text-muted fw-normal timeago" title="{./timestampISO}"></span>
60
+ </span>
71
61
  </div>
62
+ {{{ if ./thumbs.length }}}
63
+ <a class="position-relative text-decoration-none flex-shrink-0 d-none d-xl-block" href="{config.relative_path}/topic/{./slug}{{{ if ./bookmark }}}/{./bookmark}{{{ end }}}">
64
+ <img class="topic-thumb rounded-1" style="width:auto;height: 3.33rem;" src="{./thumbs.0.url}"/>
65
+ <span data-numthumbs="{./thumbs.length}" class="px-1 position-absolute top-0 start-100 translate-middle badge rounded bg-info" style="z-index: 1;">+{increment(./thumbs.length, "-1")}</span>
66
+ </a>
67
+ {{{ end }}}
68
+ </div>
72
69
 
73
- <div class="col-md-2 d-none d-lg-flex stats text-muted gap-2 px-0">
70
+ <div class="d-flex p-0 col-lg-5 align-content-stretch">
71
+ <div class="meta stats d-none d-lg-grid col-6 gap-1 pe-2 text-muted" style="grid-template-columns: 1fr 1fr 1fr;">
74
72
  {{{ if !reputation:disabled }}}
75
- <div class="stats-votes flex-1">
76
- <div class="align-items-center card card-header px-0 py-2 border-0 rounded-1">
77
- <span class="human-readable-number fs-5 fw-semibold ff-secondary lh-1" title="{./votes}" data-toFixed="0">{./votes}</span>
78
- <span class="text-lowercase text-xs">[[global:votes]]</span>
79
- </div>
73
+ <div class="stats-votes card card-header border-0 p-2 overflow-hidden rounded-1 d-flex flex-column align-items-center">
74
+ <span class="human-readable-number fs-5 ff-secondary lh-1" title="{./votes}" data-toFixed="0">{./votes}</span>
75
+ <span class="d-none d-xl-flex text-lowercase text-xs">[[global:votes]]</span>
76
+ <i class="d-xl-none fa fa-fw text-xs text-muted opacity-75 fa-chevron-up"></i>
80
77
  </div>
81
78
  {{{ end }}}
82
- <div class="stats-postcount flex-1">
83
- <div class="align-items-center card card-header px-0 py-2 border-0 rounded-1">
84
- <span class="human-readable-number fs-5 fw-semibold ff-secondary lh-1" title="{./postcount}" data-toFixed="0">{./postcount}</span>
85
- <span class="text-lowercase text-xs">[[global:posts]]</span>
86
- </div>
79
+ <div class="stats-postcount card card-header border-0 p-2 overflow-hidden rounded-1 d-flex flex-column align-items-center">
80
+ <span class="human-readable-number fs-5 ff-secondary lh-1" title="{./postcount}" data-toFixed="0">{./postcount}</span>
81
+ <span class="d-none d-xl-flex text-lowercase text-xs">[[global:posts]]</span>
82
+ <i class="d-xl-none fa fa-fw text-xs text-muted opacity-75 fa-message"></i>
87
83
  </div>
88
- <div class="stats-viewcount flex-1">
89
- <div class="align-items-center card card-header px-0 py-2 border-0 rounded-1">
90
- <span class="human-readable-number fs-5 fw-semibold ff-secondary lh-1" title="{./viewcount}" data-toFixed="0">{./viewcount}</span>
91
- <span class="text-lowercase text-xs">[[global:views]]</span>
92
- </div>
84
+ <div class="stats-viewcount card card-header border-0 p-2 overflow-hidden rounded-1 d-flex flex-column align-items-center">
85
+ <span class="human-readable-number fs-5 ff-secondary lh-1" title="{./viewcount}" data-toFixed="0">{./viewcount}</span>
86
+ <span class="d-none d-xl-flex text-lowercase text-xs">[[global:views]]</span>
87
+ <i class="d-xl-none fa fa-fw text-xs text-muted opacity-75 fa-eye"></i>
93
88
  </div>
94
89
  </div>
95
-
96
- <div class="col-md-3 col-sm-3 teaser d-none d-md-block overflow-hidden" component="topic/teaser">
97
- <div class="lastpost background-link-container border-start border-2 h-100" style="border-color: {./category.bgColor}!important;">
90
+ <div component="topic/teaser" class="meta teaser col-lg-6">
91
+ <div class="lastpost background-link-container border-start border-2 lh-sm h-100" style="border-color: {./category.bgColor}!important;">
98
92
  <a class="background-link" href="{config.relative_path}/topic/{./slug}/{./teaser.index}"></a>
99
93
  {{{ if ./unreplied }}}
100
- <p class="ps-3 text-xs lh-1">
94
+ <div class="ps-2 text-xs">
101
95
  [[category:no_replies]]
102
- </p>
96
+ </div>
103
97
  {{{ else }}}
104
98
  {{{ if ./teaser.pid }}}
105
- <p class="ps-3 mb-0 lh-1">
106
- <a href="{config.relative_path}/user/{./teaser.user.userslug}" class="text-decoration-none">{buildAvatar(./teaser.user, "18px", true, "not-responsive")}</a>
99
+ <div class="ps-2">
100
+ <a href="{config.relative_path}/user/{./teaser.user.userslug}" class="text-decoration-none">{buildAvatar(./teaser.user, "18px", true, "avatar-tooltip not-responsive")}</a>
107
101
  <a class="permalink text-muted timeago text-xs" href="{config.relative_path}/topic/{./slug}/{./teaser.index}" title="{./teaser.timestampISO}">
108
102
  </a>
109
- </p>
110
- <div class="post-content overflow-hidden text-xs line-clamp-2 ps-3">
103
+ </div>
104
+ <div class="post-content text-xs ps-2 line-clamp-2 lh-sm text-break">
111
105
  {./teaser.content}
112
106
  </div>
113
107
  {{{ end }}}
114
108
  {{{ end }}}
115
109
  </div>
116
110
  </div>
117
-
118
- {{{ if showSelect }}}
119
- <div class="position-absolute top-0 end-0 w-auto p-0">
120
- <i component="topic/select" class="fa fa-square-o fs-5 text-muted pointer"></i>
121
- </div>
122
- {{{ end }}}
123
111
  </div>
124
- <hr class="text-muted opacity-25"/>
112
+ {{{ if showSelect }}}
113
+ <div class="checkbox position-absolute top-0 end-0 p-1 mt-3 m-0 d-flex d-lg-none" style="max-width:max-content">
114
+ <i component="topic/select" class="fa fa-square-o text-muted pointer"></i>
115
+ </div>
116
+ {{{ end }}}
125
117
  </li>
126
118
  {{{end}}}
127
119
  </ul>