nodebb-theme-harmony 0.0.1 → 0.0.3

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 (139) hide show
  1. package/languages/en-GB/harmony.json +5 -0
  2. package/library.js +101 -26
  3. package/package.json +5 -2
  4. package/plugin.json +14 -2
  5. package/public/harmony.js +101 -0
  6. package/scss/account.scss +38 -0
  7. package/scss/chats.scss +72 -0
  8. package/scss/common.scss +65 -0
  9. package/scss/fonts.scss +17 -0
  10. package/scss/groups.scss +30 -0
  11. package/scss/harmony.scss +23 -3
  12. package/scss/header.scss +16 -0
  13. package/scss/mixins.scss +183 -0
  14. package/scss/modals.scss +4 -0
  15. package/scss/modules/bottom-sheet.scss +52 -0
  16. package/scss/modules/breadcrumbs.scss +16 -0
  17. package/scss/modules/composer.scss +21 -0
  18. package/scss/modules/cover.scss +115 -0
  19. package/scss/modules/tags.scss +6 -0
  20. package/scss/modules/topic-navigator.scss +61 -0
  21. package/scss/modules/topics-list.scss +20 -0
  22. package/scss/modules/user-menu.scss +5 -0
  23. package/scss/overrides.scss +65 -0
  24. package/scss/sidebar.scss +125 -0
  25. package/scss/skins.scss +13 -0
  26. package/scss/status.scss +25 -0
  27. package/scss/topic.scss +128 -0
  28. package/templates/account/best.tpl +0 -2
  29. package/templates/account/blocks.tpl +31 -26
  30. package/templates/account/bookmarks.tpl +0 -2
  31. package/templates/account/categories.tpl +1 -3
  32. package/templates/account/controversial.tpl +0 -2
  33. package/templates/account/downvoted.tpl +0 -2
  34. package/templates/account/followers.tpl +14 -10
  35. package/templates/account/following.tpl +14 -10
  36. package/templates/account/groups.tpl +13 -11
  37. package/templates/account/ignored.tpl +0 -2
  38. package/templates/account/posts.tpl +29 -10
  39. package/templates/account/profile.tpl +76 -159
  40. package/templates/account/topics.tpl +32 -21
  41. package/templates/account/uploads.tpl +38 -35
  42. package/templates/account/upvoted.tpl +0 -2
  43. package/templates/account/watched.tpl +0 -2
  44. package/templates/admin/plugins/harmony.tpl +17 -0
  45. package/templates/categories.tpl +5 -5
  46. package/templates/category.tpl +26 -26
  47. package/templates/chat.tpl +9 -9
  48. package/templates/chats.tpl +5 -7
  49. package/templates/footer.tpl +11 -7
  50. package/templates/groups/details.tpl +74 -64
  51. package/templates/groups/list.tpl +19 -14
  52. package/templates/header.tpl +34 -21
  53. package/templates/login.tpl +51 -45
  54. package/templates/partials/account/admin-menu.tpl +36 -0
  55. package/templates/partials/account/category-item.tpl +17 -17
  56. package/templates/partials/account/header.tpl +77 -35
  57. package/templates/partials/account/sidebar-left.tpl +82 -0
  58. package/templates/partials/breadcrumbs.tpl +4 -12
  59. package/templates/partials/categories/item.tpl +48 -44
  60. package/templates/partials/categories/lastpost.tpl +17 -19
  61. package/templates/partials/categories/link.tpl +5 -13
  62. package/templates/partials/category/sort.tpl +4 -7
  63. package/templates/partials/category/subcategory.tpl +4 -4
  64. package/templates/partials/category/tools.tpl +6 -9
  65. package/templates/partials/category/watch.tpl +7 -11
  66. package/templates/partials/category-filter-content.tpl +5 -6
  67. package/templates/partials/category-filter.tpl +0 -2
  68. package/templates/partials/category-selector-content.tpl +4 -5
  69. package/templates/partials/category-selector.tpl +0 -2
  70. package/templates/partials/chats/dropdown.tpl +24 -32
  71. package/templates/partials/chats/message-window.tpl +7 -7
  72. package/templates/partials/chats/message.tpl +34 -34
  73. package/templates/partials/chats/recent_room.tpl +16 -29
  74. package/templates/partials/chats/system-message.tpl +4 -4
  75. package/templates/partials/chats/user.tpl +1 -3
  76. package/templates/partials/groups/admin.tpl +82 -183
  77. package/templates/partials/groups/badge.tpl +1 -3
  78. package/templates/partials/groups/invited.tpl +33 -0
  79. package/templates/partials/groups/list.tpl +14 -21
  80. package/templates/partials/groups/memberlist.tpl +28 -24
  81. package/templates/partials/groups/pending.tpl +30 -0
  82. package/templates/partials/groups/sidebar-left.tpl +27 -0
  83. package/templates/partials/mobile-footer.tpl +70 -0
  84. package/templates/partials/notifications_list.tpl +19 -27
  85. package/templates/partials/paginator.tpl +22 -24
  86. package/templates/partials/post_bar.tpl +23 -18
  87. package/templates/partials/posts_list.tpl +0 -2
  88. package/templates/partials/posts_list_item.tpl +14 -29
  89. package/templates/partials/quick-search-results.tpl +36 -25
  90. package/templates/partials/search-results.tpl +4 -1
  91. package/templates/partials/sidebar/chats.tpl +53 -0
  92. package/templates/partials/sidebar/drafts.tpl +41 -0
  93. package/templates/partials/sidebar/logged-out-menu.tpl +38 -0
  94. package/templates/partials/sidebar/notifications.tpl +28 -0
  95. package/templates/partials/sidebar/search-mobile.tpl +29 -0
  96. package/templates/partials/sidebar/search.tpl +30 -0
  97. package/templates/partials/sidebar/user-menu.tpl +87 -0
  98. package/templates/partials/sidebar-left.tpl +40 -0
  99. package/templates/partials/sidebar-right.tpl +41 -0
  100. package/templates/partials/skin-switcher.tpl +35 -0
  101. package/templates/partials/tags_list.tpl +0 -2
  102. package/templates/partials/toast.tpl +6 -8
  103. package/templates/partials/topic/event.tpl +4 -20
  104. package/templates/partials/topic/navigator.tpl +20 -41
  105. package/templates/partials/topic/necro-post.tpl +5 -4
  106. package/templates/partials/topic/post-menu.tpl +23 -2
  107. package/templates/partials/topic/post-placeholder.tpl +15 -0
  108. package/templates/partials/topic/post.tpl +67 -64
  109. package/templates/partials/topic/quickreply.tpl +12 -14
  110. package/templates/partials/topic/reactions.tpl +0 -2
  111. package/templates/partials/topic/reply-button.tpl +16 -20
  112. package/templates/partials/topic/selection-tooltip.tpl +0 -2
  113. package/templates/partials/topic/sort.tpl +8 -6
  114. package/templates/partials/topic/stats.tpl +15 -14
  115. package/templates/partials/topic/tag.tpl +1 -3
  116. package/templates/partials/topic/tags.tpl +1 -5
  117. package/templates/partials/topic/tools.tpl +13 -0
  118. package/templates/partials/topic/watch.tpl +15 -13
  119. package/templates/partials/topic-filters.tpl +4 -5
  120. package/templates/partials/topic-list-bar.tpl +54 -0
  121. package/templates/partials/topic-terms.tpl +4 -5
  122. package/templates/partials/topics_list.tpl +109 -100
  123. package/templates/partials/users/item.tpl +7 -0
  124. package/templates/partials/users_list.tpl +11 -60
  125. package/templates/partials/users_list_menu.tpl +10 -18
  126. package/templates/popular.tpl +1 -18
  127. package/templates/recent.tpl +8 -24
  128. package/templates/register.tpl +74 -60
  129. package/templates/tag.tpl +3 -15
  130. package/templates/tags.tpl +3 -4
  131. package/templates/top.tpl +1 -18
  132. package/templates/topic.tpl +39 -43
  133. package/templates/unread.tpl +1 -22
  134. package/templates/users.tpl +17 -17
  135. package/templates/admin/plugins/persona.tpl +0 -29
  136. package/templates/partials/account/menu.tpl +0 -103
  137. package/templates/partials/header/user-menu.tpl +0 -87
  138. package/templates/partials/menu.tpl +0 -188
  139. package/templates/partials/thread_tools.tpl +0 -10
@@ -1,28 +1,26 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <!-- IF privileges.topics:reply -->
4
- <div component="topic/quickreply/container" class="clearfix quick-reply">
5
- <div class="icon float-start hidden-xs">
6
- <a data-uid="{loggedInUser.uid}" href="{{{ if loggedInUser.userslug }}}{config.relative_path}/user/{loggedInUser.userslug}{{{ else }}}#{{{ end }}}">
2
+ <div component="topic/quickreply/container" class="quick-reply d-flex gap-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 -->">
7
5
  {buildAvatar(loggedInUser, "48px", true, "", "user/picture")}
8
- {{{ if loggedInUser.status }}}
9
- <i component="user/status" class="fa fa-circle status {loggedInUser.status}" title="[[global:{loggedInUser.status}]]"></i>
10
- {{{ end }}}
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 }}}
11
7
  </a>
12
8
  </div>
13
- <form method="post" action="{config.relative_path}/compose">
9
+ <form class="flex-grow-1 d-flex flex-column gap-2" method="post" action="{config.relative_path}/compose">
14
10
  <input type="hidden" name="tid" value="{tid}" />
15
11
  <input type="hidden" name="_csrf" value="{config.csrf_token}" />
16
12
  <div class="quickreply-message">
17
- <textarea name="content" component="topic/quickreply/text" class="form-control mousetrap" rows="5" placeholder="[[modules:composer.textarea.placeholder]]"></textarea>
13
+ <textarea rows="4" name="content" component="topic/quickreply/text" class="form-control mousetrap" placeholder="[[modules:composer.textarea.placeholder]]"></textarea>
18
14
  <div class="imagedrop"><div>[[topic:composer.drag_and_drop_images]]</div></div>
19
15
  </div>
20
- <div class="btn-group float-end">
21
- <button type="submit" component="topic/quickreply/button" class="btn btn-primary">[[topic:post-quick-reply]]</button>
22
- <button type="submit" component="topic/quickreply/expand" class="btn btn-outline-primary" formmethod="get"><i class="fa fa-expand"></i></button>
16
+ <div>
17
+ <div class="btn-group">
18
+ <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
+ </div>
23
21
  </div>
24
22
  </form>
25
- <form component="topic/quickreply/upload" method="post" enctype="multipart/form-data">
23
+ <form class="d-none" component="topic/quickreply/upload" method="post" enctype="multipart/form-data">
26
24
  <input type="file" name="files[]" multiple class="hidden"/>
27
25
  </form>
28
26
 
@@ -1,3 +1 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <!-- This partial intentionally left blank; overwritten by nodebb-plugin-reactions -->
@@ -1,8 +1,6 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <div component="topic/reply/container" class="btn-group action-bar bottom-sheet <!-- IF !privileges.topics:reply -->hidden<!-- ENDIF !privileges.topics:reply -->">
4
- <a href="{config.relative_path}/compose?tid={tid}&title={title}" class="btn btn-sm btn-primary" component="topic/reply" data-ajaxify="false" role="button"><i class="fa fa-reply visible-xs-inline"></i><span class="visible-sm-inline visible-md-inline visible-lg-inline"> [[topic:reply]]</span></a>
5
- <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-bs-toggle="dropdown">
2
+ <a href="{config.relative_path}/compose?tid={tid}&title={title}" class="d-flex align-items-center btn btn-primary px-3 py-2 fw-semibold border border-0 " component="topic/reply" data-ajaxify="false" role="button"><i class="fa fa-reply visible-xs-inline"></i><span class="visible-md-inline visible-lg-inline"> [[topic:reply]]</span></a>
3
+ <button type="button" class="btn btn-sm btn-primary dropdown-toggle border border-0 border-start border-primary" data-bs-toggle="dropdown">
6
4
  <span class="caret"></span>
7
5
  </button>
8
6
  <ul class="dropdown-menu dropdown-menu-end" role="menu">
@@ -10,20 +8,18 @@
10
8
  </ul>
11
9
  </div>
12
10
 
13
- <!-- IF loggedIn -->
14
- <!-- IF !privileges.topics:reply -->
15
- <!-- IF locked -->
16
- <a component="topic/reply/locked" class="btn btn-sm btn-primary" disabled><i class="fa fa-lock"></i> [[topic:locked]]</a>
17
- <!-- ENDIF locked -->
18
- <!-- ENDIF !privileges.topics:reply -->
19
-
20
- <!-- IF !locked -->
21
- <a component="topic/reply/locked" class="btn btn-sm btn-primary hidden" disabled><i class="fa fa-lock"></i> [[topic:locked]]</a>
22
- <!-- ENDIF !locked -->
23
-
24
- <!-- ELSE -->
11
+ {{{ if loggedIn }}}
12
+ {{{ if !privileges.topics:reply }}}
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>
15
+ {{{ end }}}
16
+ {{{ end }}}
25
17
 
26
- <!-- IF !privileges.topics:reply -->
27
- <a component="topic/reply/guest" href="{config.relative_path}/login" class="btn btn-sm btn-primary">[[topic:guest-login-reply]]</a>
28
- <!-- ENDIF !privileges.topics:reply -->
29
- <!-- ENDIF loggedIn -->
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>
20
+ {{{ end }}}
21
+ {{{ else }}}
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>
24
+ {{{ end }}}
25
+ {{{ end }}}
@@ -1,5 +1,3 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <div component="selection/tooltip" class="selection-tooltip-container position-absolute card card-body p-1 rounded-1 mt-2" style="z-index: 1;">
4
2
  <button component="selection/tooltip/quote" class="btn btn-sm btn-primary quote-tooltip-btn">[[topic:quote]]</button>
5
3
  </div>
@@ -1,9 +1,11 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <div title="[[topic:sort_by]]" class="btn-group bottom-sheet hidden-xs" component="thread/sort">
4
- <button class="btn btn-sm btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown" type="button">
5
- <span><i class="fa fa-fw fa-sort"></i></span></button>
6
- <ul class="dropdown-menu dropdown-menu-end">
1
+ <div class="btn-group bottom-sheet" component="thread/sort">
2
+ <button class="btn btn-link d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown" type="button">
3
+ <span class="d-flex gap-2 align-items-center">
4
+ <i class="fa fa-fw fa-arrow-down-wide-short small link-primary"></i>
5
+ <span class="d-none d-md-inline small">[[topic:sort_by]]</span>
6
+ </span>
7
+ </button>
8
+ <ul class="dropdown-menu">
7
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>
8
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>
9
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>
@@ -1,14 +1,15 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <div class="stats text-muted">
4
- <i class="fa fa-fw fa-user" title="[[global:posters]]"></i>
5
- <span title="{postercount}" class="human-readable-number">{postercount}</span>
6
- </div>
7
- <div class="stats text-muted">
8
- <i class="fa fa-fw fa-pencil" title="[[global:posts]]"></i>
9
- <span component="topic/post-count" title="{postcount}" class="human-readable-number">{postcount}</span>
10
- </div>
11
- <div class="stats text-muted">
12
- <i class="fa fa-fw fa-eye" title="[[global:views]]"></i>
13
- <span class="human-readable-number" title="{viewcount}">{viewcount}</span>
14
- </div>
1
+ <span class="badge text-body border border-gray-300 stats text-xs">
2
+ <i class="fa fa-fw fa-pencil visible-xs-inline" title="[[global:posts]]"></i>
3
+ <span component="topic/post-count" title="{postcount}" class="human-readable-number fw-bold">{postcount}</span>
4
+ <span class="hidden-xs text-lowercase fw-normal">[[global:posts]]</span>
5
+ </span>
6
+ <span class="badge text-body border border-gray-300 stats text-xs">
7
+ <i class="fa fa-fw fa-user visible-xs-inline" title="[[global:posters]]"></i>
8
+ <span title="{postercount}" class="human-readable-number fw-bold">{postercount}</span>
9
+ <span class="hidden-xs text-lowercase fw-normal">[[global:posters]]</span>
10
+ </span>
11
+ <span class="badge text-body border border-gray-300 stats text-xs">
12
+ <i class="fa fa-fw fa-eye visible-xs-inline" title="[[global:views]]"></i>
13
+ <span class="human-readable-number fw-bold" title="{viewcount}">{viewcount}</span>
14
+ <span class="hidden-xs text-lowercase fw-normal">[[global:views]]</span>
15
+ </span>
@@ -1,3 +1 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <a href="{config.relative_path}/tags/{./valueEncoded}"><span class="tag tag-item fw-bold tag-class-{./class}" data-tag="{./value}">{./valueEscaped}</span></a>
1
+ <a href="{config.relative_path}/tags/{./valueEncoded}"><span class="badge border border-gray-300 text-xs tag tag-class-{./class}" data-tag="{./value}">{./valueEscaped}</span></a>
@@ -1,5 +1 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- {{{ each tags }}}
4
- <!-- IMPORT partials/topic/tag.tpl -->
5
- {{{ end }}}
1
+ {{{ each tags }}}<!-- IMPORT partials/topic/tag.tpl -->{{{ end }}}
@@ -0,0 +1,13 @@
1
+ {{{ if privileges.view_thread_tools }}}
2
+ <div class="btn-group thread-tools bottom-sheet">
3
+ <button class="btn btn-link d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown" type="button">
4
+ <i class="fa fa-fw fa-gear small link-primary"></i>
5
+ <span class="d-none d-md-inline small">[[topic:thread_tools.title]]</span>
6
+ </button>
7
+ <ul class="dropdown-menu">
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
+ <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
+ <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>
11
+ </ul>
12
+ </div>
13
+ {{{ end }}}
@@ -1,21 +1,23 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <!-- IF config.loggedIn -->
4
- <div class="btn-group topic-watch-dropdown bottom-sheet" component="topic/watch"
5
- data-bs-toggle="tooltip"
6
- {{{if isFollowing}}}title="[[topic:watching]]"{{{end}}}
7
- {{{if isNotFollowing}}}title="[[topic:not-watching]]"{{{end}}}
8
- {{{if isIgnoring}}}title="[[topic:ignoring]]"{{{end}}}
9
- >
10
- <button class="btn btn-sm btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown" type="button">
11
- <span component="topic/following/menu" <!-- IF !isFollowing -->class="hidden"<!-- ENDIF !isFollowing -->><i class="fa fa-fw fa-bell-o"></i></span>
2
+ <div class="btn-group topic-watch-dropdown bottom-sheet" component="topic/watch">
3
+ <button class="btn btn-link d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown" type="button">
4
+ <span component="topic/following/menu" class="d-flex gap-2 align-items-center<!-- IF !isFollowing --> hidden<!-- ENDIF !isFollowing -->">
5
+ <i class="fa fa-fw fa-bell-o small link-primary"></i>
6
+ <span class="d-none d-md-inline small">[[topic:watching]]</span>
7
+ </span>
12
8
 
13
- <span component="topic/not-following/menu" <!-- IF !isNotFollowing -->class="hidden"<!-- ENDIF !isNotFollowing -->><i class="fa fa-fw fa-bell-slash-o"></i></span>
9
+ <span component="topic/not-following/menu" class="d-flex gap-2 align-items-center<!-- IF !isNotFollowing --> hidden<!-- ENDIF !isNotFollowing -->">
10
+ <i class="fa fa-fw fa-bell-slash-o small link-primary"></i>
11
+ <span class="d-none d-md-inline small">[[topic:not-watching]]</span>
12
+ </span>
14
13
 
15
- <span component="topic/ignoring/menu" <!-- IF !isIgnoring -->class="hidden"<!-- ENDIF !isIgnoring -->><i class="fa fa-fw fa-eye-slash"></i></span>
14
+ <span component="topic/ignoring/menu" class="d-flex gap-2 align-items-center<!-- IF !isIgnoring --> hidden<!-- ENDIF !isIgnoring -->">
15
+ <i class="fa fa-fw fa-eye-slash small link-primary"></i>
16
+ <span class="d-none d-md-inline small">[[topic:ignoring]]</span>
17
+ </span>
16
18
 
17
19
  </button>
18
- <ul class="dropdown-menu dropdown-menu-end">
20
+ <ul class="dropdown-menu">
19
21
  <li><a class="dropdown-item" href="#" component="topic/following"><i component="topic/following/check" class="fa fa-fw <!-- IF isFollowing -->fa-check<!-- ENDIF isFollowing -->"></i><i class="fa fa-fw fa-bell-o"></i> [[topic:watching]]<p class="help-text hidden-xs"><small>[[topic:watching.description]]</small></p></a></li>
20
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<!-- ENDIF isNotFollowing -->"></i><i class="fa fa-fw fa-bell-slash-o"></i> [[topic:not-watching]]<p class="help-text hidden-xs"><small>[[topic:not-watching.description]]</small></p></a></li>
21
23
  <li><a class="dropdown-item" href="#" component="topic/ignoring"><i component="topic/ignoring/check" class="fa fa-fw <!-- IF isIgnoring -->fa-check<!-- ENDIF isIgnoring -->"></i><i class="fa fa-fw fa-eye-slash"></i> [[topic:ignoring]]<p class="help-text hidden-xs"><small>[[topic:ignoring.description]]</small></p></a></li>
@@ -1,10 +1,9 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <div class="btn-group bottom-sheet{{{ if !filters.length }}} hidden{{{ end }}}">
4
- <button type="button" class="btn btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown">
5
- <span class="visible-sm-inline visible-md-inline visible-lg-inline">{selectedFilter.name}</span><span class="visible-xs-inline"><i class="fa fa-fw {selectedFilter.icon}"></i></span> <span class="caret"></span>
2
+ <button type="button" class="btn btn-link d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown">
3
+ <i class="fa fa-fw fa-filter small link-primary"></i>
4
+ <span class="visible-md-inline visible-lg-inline small">{selectedFilter.name}</span>
6
5
  </button>
7
- <ul class="dropdown-menu dropdown-menu-end" role="menu">
6
+ <ul class="dropdown-menu" role="menu">
8
7
  {{{each filters}}}
9
8
  <li role="presentation" class="category {{{if filters.selected}}}selected{{{end}}}">
10
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>
@@ -0,0 +1,54 @@
1
+ <nav class="topic-list-header sticky-tools 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 -->
24
+
25
+ {{{ if (!feeds:disableRSS && rssFeedUrl) }}}
26
+ <a class="btn btn-link link-primary d-none d-lg-block" target="_blank" href="{rssFeedUrl}" itemprop="item"><i class="fa fa-rss"></i></a>
27
+ {{{ end }}}
28
+
29
+ <a href="{config.relative_path}{{{ if template.category }}}{url}{{{ else }}}/{selectedFilter.url}{querystring}{{{ end }}}" class="d-inline-block">
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>
33
+
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 text-nowrap" data-ajaxify="false" role="button">[[category:new_topic_button]]</a>
38
+ {{{ else }}}
39
+ {{{ if !loggedIn }}}
40
+ <a component="category/post/guest" href="{config.relative_path}/login" class="btn btn-primary">[[category:guest-login-post]]</a>
41
+ {{{ end }}}
42
+ {{{ end }}}
43
+ {{{ else }}}
44
+ {{{ if canPost }}}
45
+ <!-- IMPORT partials/buttons/newTopic.tpl -->
46
+ {{{ else }}}
47
+ {{{ if !loggedIn }}}
48
+ <a component="category/post/guest" href="{config.relative_path}/login" class="btn btn-primary">[[category:guest-login-post]]</a>
49
+ {{{ end }}}
50
+ {{{ end }}}
51
+ {{{ end }}}
52
+ </div>
53
+ </div>
54
+ </nav>
@@ -1,10 +1,9 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <div class="btn-group bottom-sheet {{{ if !terms.length }}}hidden{{{ end }}}">
4
- <button type="button" class="btn btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown">
5
- {selectedTerm.name} <span class="caret"></span>
2
+ <button type="button" class="btn btn-link d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown">
3
+ <i class="fa fa-fw fa-clock small link-primary"></i>
4
+ <span class="visible-md-inline visible-lg-inline small">{selectedTerm.name}</span>
6
5
  </button>
7
- <ul class="dropdown-menu dropdown-menu-end" role="menu">
6
+ <ul class="dropdown-menu" role="menu">
8
7
  {{{each terms}}}
9
8
  <li role="presentation" class="category">
10
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>
@@ -1,118 +1,127 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
1
+ <ul component="category" class="list-unstyled topic-list pt-3 overflow-auto position-relative" itemscope itemtype="http://www.schema.org/ItemList" data-nextstart="{nextStart}" data-set="{set}">
2
2
 
3
- <ul component="category" class="topic-list" itemscope itemtype="http://www.schema.org/ItemList" data-nextstart="{nextStart}" data-set="{set}">
4
- {{{each topics}}}
5
- <li component="category/topic" class="row clearfix category-item {function.generateTopicClass}" <!-- IMPORT partials/data/category.tpl -->>
6
- <link itemprop="url" content="{config.relative_path}/topic/{../slug}" />
7
- <meta itemprop="name" content="{function.stripTags, ../title}" />
3
+ {{{ each topics }}}
4
+ <li component="category/topic" class="category-item position-relative {function.generateTopicClass}" <!-- IMPORT partials/data/category.tpl -->>
5
+ <link itemprop="url" content="{config.relative_path}/topic/{./slug}" />
6
+ <meta itemprop="name" content="{function.stripTags, ./title}" />
8
7
  <meta itemprop="itemListOrder" content="descending" />
9
- <meta itemprop="position" content="{../index}" />
10
- <a id="{../index}" data-index="{../index}" component="topic/anchor"></a>
8
+ <meta itemprop="position" content="{./index}" />
9
+ <a id="{./index}" data-index="{./index}" component="topic/anchor"></a>
11
10
 
12
- <div class="col-md-6 col-sm-9 col-10 content">
13
- <div class="avatar float-start me-2">
14
- <!-- IF showSelect -->
15
- <div class="select" component="topic/select">
16
- {{{ if ./thumbs.length }}}
17
- <img src="{./thumbs.0.url}" class="user-img not-responsive" />
18
- {{{ else }}}
19
- {buildAvatar(../user, "48px", true, "not-responsive")}
20
- {{{ end }}}
21
- <i class="fa fa-check"></i>
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>
22
23
  </div>
23
- <!-- ENDIF showSelect -->
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>
24
52
 
25
- <!-- IF !showSelect -->
26
- <a href="<!-- IF topics.user.userslug -->{config.relative_path}/user/{topics.user.userslug}<!-- ELSE -->#<!-- ENDIF topics.user.userslug -->" class="float-start">
27
- {{{ if ./thumbs.length }}}
28
- <img src="{./thumbs.0.url}" class="user-img not-responsive" />
29
- {{{ else }}}
30
- {buildAvatar(../user, "48px", true, "not-responsive")}
31
- {{{ end }}}
32
- </a>
33
- <!-- ENDIF !showSelect -->
34
- </div>
35
53
 
36
- <h2 component="topic/header" class="title mb-1">
37
- <i component="topic/scheduled" class="fa fa-clock-o {{{ if !topics.scheduled }}}hide{{{ end }}}" title="[[topic:scheduled]]"></i>
38
- <i component="topic/pinned" class="fa fa-thumb-tack {{{ if (topics.scheduled || !topics.pinned) }}}hide{{{ end }}}" title="{{{ if !../pinExpiry }}}[[topic:pinned]]{{{ else }}}[[topic:pinned-with-expiry, {../pinExpiryISO}]]{{{ end }}}"></i>
39
- <i component="topic/locked" class="fa fa-lock {{{ if !topics.locked }}}hide{{{ end }}}" title="[[topic:locked]]"></i>
40
- <i component="topic/moved" class="fa fa-arrow-circle-right {{{ if !topics.oldCid }}}hide{{{ end }}}" title="[[topic:moved]]"></i>
41
- {{{each topics.icons}}}{@value}{{{end}}}
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 }}}
42
57
 
43
- {{{ if topics.noAnchor }}}
44
- <span>{./title}</span>
45
- {{{ else }}}
46
- <a href="{config.relative_path}/topic/{./slug}{{{ if ./bookmark }}}/{./bookmark}{{{ end }}}">{./title}</a>
47
- {{{ end }}}
48
- </h2>
49
- <div class="info">
50
- <!-- IF !template.category -->
51
- <div class="category-item d-inline-block">
52
- {buildCategoryIcon(./category, "24px", "rounded-circle")}
53
- <a class="text-muted" href="{config.relative_path}/category/{topics.category.slug}">{topics.category.name}</a>
54
- </div>
55
- &bull;
56
- <!-- ENDIF !template.category -->
58
+ {{{ if ./tags.length }}}
59
+ <span class="lh-1 tag-list hidden-xs d-flex 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 }}}
57
65
 
58
- {{{ if topics.tags.length }}}
59
- <span class="tag-list hidden-xs">
60
- {{{ each ./tags }}}
61
- <!-- IMPORT partials/topic/tag.tpl -->
62
- {{{ end }}}
63
- &bull;
64
- </span>
65
- {{{ end }}}
66
-
67
- <span class="hidden-xs"><span class="timeago text-muted" title="{./timestampISO}"></span> &bull; <a class="text-muted" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">{./user.displayname}</a></span>
66
+ <span class="hidden-xs text-xs timeago text-muted me-2 mb-1" title="{./timestampISO}"></span>
68
67
 
69
- <span class="visible-xs-inline timeago text-muted" title="{{{ if ./teaser.timestampISO }}}{./teaser.timestampISO}{{{ else }}}{./timestampISO}{{{ end }}}"></span>
68
+ <span class="visible-xs-inline timeago text-muted text-xs" title="{{{ if ./teaser.timestampISO }}}{./teaser.timestampISO}{{{ else }}}{./timestampISO}{{{ end }}}"></span>
69
+ </div>
70
+ </div>
70
71
  </div>
71
- </div>
72
72
 
73
- <div class="mobile-stat col-2 visible-xs text-end">
74
- <span class="human-readable-number">{topics.postcount}</span> <a href="{config.relative_path}/topic/{topics.slug}/{topics.teaser.index}"><i class="fa fa-arrow-circle-right"></i></a>
75
- </div>
76
-
77
- <div class="col-md-1 hidden-sm hidden-xs stats stats-votes">
78
- <!-- IF !reputation:disabled -->
79
- <span class="human-readable-number" title="{topics.votes}">{topics.votes}</span><br />
80
- <small>[[global:votes]]</small>
81
- <!-- END -->
82
- </div>
83
-
84
- <div class="col-md-1 hidden-sm hidden-xs stats stats-postcount">
85
- <span class="human-readable-number" title="{topics.postcount}">{topics.postcount}</span><br />
86
- <small>[[global:posts]]</small>
87
- </div>
88
-
89
- <div class="col-md-1 hidden-sm hidden-xs stats stats-viewcount">
90
- <span class="human-readable-number" title="{topics.viewcount}">{topics.viewcount}</span><br />
91
- <small>[[global:views]]</small>
92
- </div>
73
+ <div class="col-md-2 d-none d-md-flex stats text-muted gap-2 px-0">
74
+ {{{ 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>
80
+ </div>
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>
87
+ </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>
93
+ </div>
94
+ </div>
93
95
 
94
- <div class="col-md-3 col-sm-3 teaser hidden-xs" component="topic/teaser">
95
- <div class="lastpost background-link-container" style="border-color: {topics.category.bgColor}">
96
- <a class="background-link" href="{config.relative_path}/topic/{topics.slug}/{topics.teaser.index}"></a>
97
- <!-- IF topics.unreplied -->
98
- <p>
99
- [[category:no_replies]]
100
- </p>
101
- <!-- ELSE -->
102
- <!-- IF topics.teaser.pid -->
103
- <p>
104
- <a href="{config.relative_path}/user/{topics.teaser.user.userslug}">{buildAvatar(topics.teaser.user, "24px", true, "not-responsive")}</a>
105
- <a class="permalink text-muted" href="{config.relative_path}/topic/{topics.slug}/{topics.teaser.index}">
106
- <span class="timeago" title="{topics.teaser.timestampISO}"></span>
107
- </a>
108
- </p>
109
- <div class="post-content">
110
- {topics.teaser.content}
96
+ <div class="col-md-3 col-sm-3 teaser hidden-xs overflow-hidden" component="topic/teaser">
97
+ <div class="lastpost background-link-container border-start border-2 h-100" style="border-color: {./category.bgColor}!important;">
98
+ <a class="background-link" href="{config.relative_path}/topic/{./slug}/{./teaser.index}"></a>
99
+ {{{ if ./unreplied }}}
100
+ <p class="ps-3 text-xs lh-1">
101
+ [[category:no_replies]]
102
+ </p>
103
+ {{{ else }}}
104
+ {{{ 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>
107
+ <a class="permalink text-muted timeago text-xs" href="{config.relative_path}/topic/{./slug}/{./teaser.index}" title="{./teaser.timestampISO}">
108
+ </a>
109
+ </p>
110
+ <div class="post-content overflow-hidden text-xs line-clamp-2 ps-3">
111
+ {./teaser.content}
112
+ </div>
113
+ {{{ end }}}
114
+ {{{ end }}}
111
115
  </div>
112
- <!-- ENDIF topics.teaser.pid -->
113
- <!-- ENDIF topics.unreplied -->
114
116
  </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 }}}
115
123
  </div>
124
+ <hr class="text-muted opacity-25"/>
116
125
  </li>
117
126
  {{{end}}}
118
127
  </ul>
@@ -0,0 +1,7 @@
1
+ <a href="{config.relative_path}/user/{./userslug}" class="btn-ghost align-items-start">
2
+ {buildAvatar(@value, "48px", true)}
3
+ <div class="d-flex flex-1 flex-column">
4
+ <div class="fw-semibold">{./displayname}</div>
5
+ <div class="text-xs text-muted">@{./username}</div>
6
+ </div>
7
+ </a>