nodebb-theme-harmony 1.0.0 → 1.0.2

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 (155) hide show
  1. package/README.md +12 -1
  2. package/languages/en-GB/harmony.json +6 -1
  3. package/library.js +56 -25
  4. package/package.json +1 -1
  5. package/plugin.json +0 -1
  6. package/public/harmony.js +165 -41
  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 +81 -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 +3 -0
  17. package/scss/mixins.scss +7 -3
  18. package/scss/modals.scss +5 -3
  19. package/scss/modules/bottom-sheet.scss +1 -1
  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/paginator.scss +24 -0
  24. package/scss/modules/tags.scss +2 -2
  25. package/scss/modules/topic-navigator.scss +18 -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 +39 -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 +82 -72
  43. package/templates/account/sessions.tpl +8 -30
  44. package/templates/account/settings.tpl +222 -203
  45. package/templates/account/theme.tpl +39 -25
  46. package/templates/account/topics.tpl +36 -38
  47. package/templates/account/uploads.tpl +33 -40
  48. package/templates/admin/plugins/harmony.tpl +21 -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 +3 -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 +31 -27
  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 +12 -8
  80. package/templates/partials/chats/message.tpl +8 -10
  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 +165 -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/invited.tpl +1 -1
  90. package/templates/partials/groups/list.tpl +2 -2
  91. package/templates/partials/groups/memberlist.tpl +2 -2
  92. package/templates/partials/groups/sidebar-left.tpl +10 -10
  93. package/templates/partials/header/brand.tpl +9 -2
  94. package/templates/partials/mobile-footer.tpl +69 -61
  95. package/templates/partials/notifications_list.tpl +11 -8
  96. package/templates/partials/paginator.tpl +11 -9
  97. package/templates/partials/post_bar.tpl +26 -24
  98. package/templates/partials/posts_list_item.tpl +5 -5
  99. package/templates/partials/quick-search-results.tpl +3 -3
  100. package/templates/partials/search-filters.tpl +184 -0
  101. package/templates/partials/search-results.tpl +28 -35
  102. package/templates/partials/sidebar/chats.tpl +26 -34
  103. package/templates/partials/sidebar/drafts.tpl +45 -34
  104. package/templates/partials/sidebar/logged-in-menu.tpl +5 -5
  105. package/templates/partials/sidebar/logged-out-menu.tpl +1 -1
  106. package/templates/partials/sidebar/notifications.tpl +30 -9
  107. package/templates/partials/sidebar/search-mobile.tpl +1 -1
  108. package/templates/partials/sidebar/search.tpl +1 -1
  109. package/templates/partials/sidebar/user-menu.tpl +38 -29
  110. package/templates/partials/sidebar-left.tpl +14 -11
  111. package/templates/partials/sidebar-right.tpl +1 -3
  112. package/templates/partials/skin-switcher.tpl +3 -3
  113. package/templates/partials/tags/filter-dropdown-content.tpl +34 -0
  114. package/templates/partials/tags_list.tpl +4 -4
  115. package/templates/partials/topic/browsing-users.tpl +0 -2
  116. package/templates/partials/topic/event.tpl +1 -1
  117. package/templates/partials/topic/navigation-post.tpl +5 -9
  118. package/templates/partials/topic/navigator-mobile.tpl +62 -0
  119. package/templates/partials/topic/navigator.tpl +23 -17
  120. package/templates/partials/topic/post-editor.tpl +0 -2
  121. package/templates/partials/topic/post-menu-list.tpl +60 -62
  122. package/templates/partials/topic/post-menu.tpl +16 -11
  123. package/templates/partials/topic/post.tpl +45 -27
  124. package/templates/partials/topic/quickreply.tpl +8 -8
  125. package/templates/partials/topic/reply-button.tpl +7 -7
  126. package/templates/partials/topic/sort.tpl +17 -5
  127. package/templates/partials/topic/tools.tpl +2 -2
  128. package/templates/partials/topic/topic-menu-list.tpl +22 -24
  129. package/templates/partials/topic/watch.tpl +42 -9
  130. package/templates/partials/topic-filters.tpl +6 -3
  131. package/templates/partials/topic-list-bar.tpl +50 -46
  132. package/templates/partials/topic-terms.tpl +6 -3
  133. package/templates/partials/topics_list.tpl +88 -93
  134. package/templates/partials/userFilter-placeholders.tpl +5 -0
  135. package/templates/partials/users/filter-dropdown-content.tpl +23 -0
  136. package/templates/partials/users/item.tpl +25 -27
  137. package/templates/partials/users_list.tpl +1 -1
  138. package/templates/popular.tpl +3 -1
  139. package/templates/post-queue.tpl +166 -0
  140. package/templates/recent.tpl +3 -2
  141. package/templates/register.tpl +4 -4
  142. package/templates/search.tpl +39 -177
  143. package/templates/tags.tpl +3 -3
  144. package/templates/top.tpl +3 -1
  145. package/templates/topic.tpl +86 -69
  146. package/templates/unread.tpl +3 -1
  147. package/templates/users.tpl +7 -3
  148. package/templates/modules/usercard.tpl +0 -39
  149. package/templates/partials/acceptTos.tpl +0 -11
  150. package/templates/partials/category-filter-content.tpl +0 -30
  151. package/templates/partials/category-filter-right.tpl +0 -5
  152. package/templates/partials/category-filter.tpl +0 -3
  153. package/templates/partials/category-selector-right.tpl +0 -5
  154. package/templates/partials/category-selector.tpl +0 -3
  155. package/templates/partials/slideout-menu.tpl +0 -6
@@ -1,25 +1,25 @@
1
- <div component="topic/reply/container" class="btn-group action-bar bottom-sheet {{{ if !privileges.topics:reply }}}hidden{{{ end }}}">
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>
1
+ <div component="topic/reply/container" class="btn-group action-bar {{{ if !privileges.topics:reply }}}hidden{{{ end }}}">
2
+ <a href="{config.relative_path}/compose?tid={tid}" 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
 
11
11
  {{{ if loggedIn }}}
12
12
  {{{ if !privileges.topics:reply }}}
13
13
  {{{ if locked }}}
14
- <a component="topic/reply/locked" class="d-flex gap-2 align-items-center fw-semibold btn btn-primary disabled" disabled><i class="fa fa-lock"></i> [[topic:locked]]</a>
14
+ <a component="topic/reply/locked" class="d-flex gap-2 align-items-center fw-semibold btn btn-sm btn-primary disabled" disabled><i class="fa fa-lock"></i> [[topic:locked]]</a>
15
15
  {{{ end }}}
16
16
  {{{ end }}}
17
17
 
18
18
  {{{ if !locked }}}
19
- <a component="topic/reply/locked" class="d-flex gap-2 align-items-center fw-semibold btn btn-primary disabled hidden" disabled><i class="fa fa-lock"></i> [[topic:locked]]</a>
19
+ <a component="topic/reply/locked" class="d-flex gap-2 align-items-center fw-semibold btn btn-sm btn-primary disabled hidden" disabled><i class="fa fa-lock"></i> [[topic:locked]]</a>
20
20
  {{{ end }}}
21
21
  {{{ else }}}
22
22
  {{{ if !privileges.topics:reply }}}
23
- <a component="topic/reply/guest" href="{config.relative_path}/login" class="d-flex align-items-center fw-semibold btn btn-primary">[[topic:guest-login-reply]]</a>
23
+ <a component="topic/reply/guest" href="{config.relative_path}/login" class="d-flex align-items-center fw-semibold btn btn-sm btn-primary">[[topic:guest-login-reply]]</a>
24
24
  {{{ end }}}
25
25
  {{{ end }}}
@@ -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-sm 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,122 @@
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
-
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
11
 
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 pt-2 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 p-1"></i>
70
20
  </div>
21
+ {{{ end }}}
71
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 fw-normal tag tag-class-{./class}" data-tag="{./value}">{./valueEscaped}</span></a>
56
+ {{{ end }}}
57
+ </span>
58
+ {{{ end }}}
59
+ <a href="{config.relative_path}/topic/{./slug}" class="hidden-xs badge bg-transparent text-muted fw-normal timeago" title="{./timestampISO}"></a>
60
+ {{{ if !config.theme.mobileTopicTeasers}}}
61
+ <span class="visible-xs-inline badge bg-transparent text-muted fw-normal timeago" title="{{{ if ./teaser.timestampISO }}}{./teaser.timestampISO}{{{ else }}}{./timestampISO}{{{ end }}}"></span>
62
+ {{{ end }}}
63
+ </span>
64
+ </div>
65
+ {{{ if ./thumbs.length }}}
66
+ <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 }}}">
67
+ <img class="topic-thumb rounded-1" style="width:auto;height: 3.33rem;" src="{./thumbs.0.url}"/>
68
+ <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>
69
+ </a>
70
+ {{{ end }}}
71
+ </div>
72
72
 
73
- <div class="col-md-2 d-none d-lg-flex stats text-muted gap-2 px-0">
73
+ <div class="d-flex p-0 col-lg-5 align-content-stretch">
74
+ <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
75
  {{{ 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>
76
+ <div class="stats-votes card card-header border-0 p-2 overflow-hidden rounded-1 d-flex flex-column align-items-center">
77
+ <span class="human-readable-number fs-5 ff-secondary lh-1" title="{./votes}" data-toFixed="0">{./votes}</span>
78
+ <span class="d-none d-xl-flex text-lowercase text-xs">[[global:votes]]</span>
79
+ <i class="d-xl-none fa fa-fw text-xs text-muted opacity-75 fa-chevron-up"></i>
80
80
  </div>
81
81
  {{{ 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>
82
+ <div class="stats-postcount card card-header border-0 p-2 overflow-hidden rounded-1 d-flex flex-column align-items-center">
83
+ <span class="human-readable-number fs-5 ff-secondary lh-1" title="{./postcount}" data-toFixed="0">{./postcount}</span>
84
+ <span class="d-none d-xl-flex text-lowercase text-xs">[[global:posts]]</span>
85
+ <i class="d-xl-none fa fa-fw text-xs text-muted opacity-75 fa-message"></i>
87
86
  </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>
87
+ <div class="stats-viewcount card card-header border-0 p-2 overflow-hidden rounded-1 d-flex flex-column align-items-center">
88
+ <span class="human-readable-number fs-5 ff-secondary lh-1" title="{./viewcount}" data-toFixed="0">{./viewcount}</span>
89
+ <span class="d-none d-xl-flex text-lowercase text-xs">[[global:views]]</span>
90
+ <i class="d-xl-none fa fa-fw text-xs text-muted opacity-75 fa-eye"></i>
93
91
  </div>
94
92
  </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;">
93
+ <div component="topic/teaser" class="meta teaser col-lg-6 {{{ if !config.theme.mobileTopicTeasers }}}d-none d-lg-block{{{ end }}}">
94
+ <div class="lastpost background-link-container border-start border-2 lh-sm h-100" style="border-color: {./category.bgColor}!important;">
98
95
  <a class="background-link" href="{config.relative_path}/topic/{./slug}/{./teaser.index}"></a>
99
96
  {{{ if ./unreplied }}}
100
- <p class="ps-3 text-xs lh-1">
97
+ <div class="ps-2 text-xs">
101
98
  [[category:no_replies]]
102
- </p>
99
+ </div>
103
100
  {{{ else }}}
104
101
  {{{ 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>
102
+ <div class="ps-2">
103
+ <a href="{config.relative_path}/user/{./teaser.user.userslug}" class="text-decoration-none">{buildAvatar(./teaser.user, "18px", true, "avatar-tooltip not-responsive")}</a>
107
104
  <a class="permalink text-muted timeago text-xs" href="{config.relative_path}/topic/{./slug}/{./teaser.index}" title="{./teaser.timestampISO}">
108
105
  </a>
109
- </p>
110
- <div class="post-content overflow-hidden text-xs line-clamp-2 ps-3">
106
+ </div>
107
+ <div class="post-content text-xs ps-2 line-clamp-sm-2 lh-sm text-break">
111
108
  {./teaser.content}
112
109
  </div>
113
110
  {{{ end }}}
114
111
  {{{ end }}}
115
112
  </div>
116
113
  </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
114
  </div>
124
- <hr class="text-muted opacity-25"/>
115
+ {{{ if showSelect }}}
116
+ <div class="checkbox position-absolute top-0 end-0 mt-3 m-0 d-flex d-lg-none" style="max-width:max-content">
117
+ <i component="topic/select" class="fa fa-square-o text-muted pointer p-1"></i>
118
+ </div>
119
+ {{{ end }}}
125
120
  </li>
126
121
  {{{end}}}
127
122
  </ul>
@@ -0,0 +1,5 @@
1
+ <div class="placeholder-wave w-100 d-flex gap-2">
2
+ <button class="btn btn-light btn-sm border placeholder col-3"></button>
3
+ <button class="btn btn-light btn-sm border placeholder col-4"></button>
4
+ <button class="btn btn-light btn-sm border placeholder col-3"></button>
5
+ </div>