nodebb-theme-harmony 1.0.0-beta.11 → 1.0.0-beta.110

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 (151) hide show
  1. package/README.md +12 -1
  2. package/languages/en-GB/harmony.json +6 -1
  3. package/library.js +27 -25
  4. package/package.json +1 -1
  5. package/plugin.json +0 -1
  6. package/public/harmony.js +133 -9
  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 +53 -25
  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/topic-navigator.scss +18 -42
  25. package/scss/modules/topics-list.scss +32 -17
  26. package/scss/modules/user-menu.scss +6 -0
  27. package/scss/overrides.scss +4 -1
  28. package/scss/sidebar.scss +39 -11
  29. package/scss/topic.scss +19 -13
  30. package/templates/account/blocks.tpl +35 -40
  31. package/templates/account/categories.tpl +47 -29
  32. package/templates/account/consent.tpl +66 -10
  33. package/templates/account/edit/password.tpl +25 -30
  34. package/templates/account/edit/username.tpl +21 -26
  35. package/templates/account/edit.tpl +105 -116
  36. package/templates/account/followers.tpl +12 -19
  37. package/templates/account/following.tpl +12 -18
  38. package/templates/account/groups.tpl +12 -17
  39. package/templates/account/info.tpl +178 -206
  40. package/templates/account/posts.tpl +31 -36
  41. package/templates/account/profile.tpl +66 -73
  42. package/templates/account/sessions.tpl +8 -30
  43. package/templates/account/settings.tpl +222 -203
  44. package/templates/account/theme.tpl +39 -25
  45. package/templates/account/topics.tpl +36 -38
  46. package/templates/account/uploads.tpl +33 -40
  47. package/templates/admin/plugins/harmony.tpl +21 -3
  48. package/templates/categories.tpl +3 -6
  49. package/templates/category.tpl +13 -14
  50. package/templates/chats.tpl +9 -10
  51. package/templates/flags/detail.tpl +160 -193
  52. package/templates/flags/list.tpl +3 -70
  53. package/templates/footer.tpl +2 -2
  54. package/templates/groups/details.tpl +22 -19
  55. package/templates/groups/list.tpl +1 -1
  56. package/templates/groups/members.tpl +0 -2
  57. package/templates/header.tpl +2 -2
  58. package/templates/login.tpl +4 -4
  59. package/templates/notifications.tpl +5 -5
  60. package/templates/partials/account/admin-menu.tpl +9 -9
  61. package/templates/partials/account/category-item.tpl +14 -17
  62. package/templates/partials/account/footer.tpl +3 -0
  63. package/templates/partials/account/header.tpl +78 -81
  64. package/templates/partials/account/session-list.tpl +18 -0
  65. package/templates/partials/account/sidebar-left.tpl +31 -25
  66. package/templates/partials/breadcrumbs.tpl +6 -6
  67. package/templates/partials/buttons/newTopic.tpl +1 -1
  68. package/templates/partials/categories/item.tpl +31 -27
  69. package/templates/partials/categories/lastpost.tpl +7 -7
  70. package/templates/partials/category/filter-dropdown-content.tpl +37 -0
  71. package/templates/partials/{category-selector-content.tpl → category/selector-dropdown-content.tpl} +7 -7
  72. package/templates/partials/category/sort.tpl +22 -7
  73. package/templates/partials/category/subcategory.tpl +2 -3
  74. package/templates/partials/category/tags.tpl +0 -2
  75. package/templates/partials/category/tools.tpl +28 -25
  76. package/templates/partials/category/watch.tpl +39 -6
  77. package/templates/partials/chats/dropdown.tpl +4 -1
  78. package/templates/partials/chats/message-window.tpl +10 -9
  79. package/templates/partials/chats/message.tpl +4 -6
  80. package/templates/partials/chats/options.tpl +14 -6
  81. package/templates/partials/chats/recent_room.tpl +41 -32
  82. package/templates/partials/cookie-consent.tpl +5 -5
  83. package/templates/partials/flags/bulk-actions.tpl +9 -0
  84. package/templates/partials/flags/filters.tpl +165 -78
  85. package/templates/partials/flags/results.tpl +38 -0
  86. package/templates/partials/groups/admin.tpl +4 -4
  87. package/templates/partials/groups/badge.tpl +1 -1
  88. package/templates/partials/groups/list.tpl +2 -2
  89. package/templates/partials/groups/memberlist.tpl +1 -1
  90. package/templates/partials/groups/sidebar-left.tpl +10 -10
  91. package/templates/partials/header/brand.tpl +9 -2
  92. package/templates/partials/mobile-footer.tpl +13 -13
  93. package/templates/partials/notifications_list.tpl +11 -8
  94. package/templates/partials/paginator.tpl +11 -9
  95. package/templates/partials/post_bar.tpl +26 -25
  96. package/templates/partials/posts_list_item.tpl +5 -5
  97. package/templates/partials/quick-search-results.tpl +3 -3
  98. package/templates/partials/search-filters.tpl +184 -0
  99. package/templates/partials/search-results.tpl +28 -35
  100. package/templates/partials/sidebar/chats.tpl +22 -33
  101. package/templates/partials/sidebar/drafts.tpl +45 -34
  102. package/templates/partials/sidebar/logged-in-menu.tpl +5 -5
  103. package/templates/partials/sidebar/logged-out-menu.tpl +1 -1
  104. package/templates/partials/sidebar/notifications.tpl +28 -7
  105. package/templates/partials/sidebar/search.tpl +1 -1
  106. package/templates/partials/sidebar/user-menu.tpl +38 -29
  107. package/templates/partials/sidebar-left.tpl +11 -11
  108. package/templates/partials/sidebar-right.tpl +1 -3
  109. package/templates/partials/skin-switcher.tpl +3 -3
  110. package/templates/partials/tags/filter-dropdown-content.tpl +34 -0
  111. package/templates/partials/tags_list.tpl +4 -4
  112. package/templates/partials/topic/browsing-users.tpl +0 -2
  113. package/templates/partials/topic/event.tpl +1 -1
  114. package/templates/partials/topic/navigator-mobile.tpl +30 -11
  115. package/templates/partials/topic/navigator.tpl +23 -17
  116. package/templates/partials/topic/post-editor.tpl +0 -2
  117. package/templates/partials/topic/post-menu-list.tpl +60 -62
  118. package/templates/partials/topic/post-menu.tpl +16 -11
  119. package/templates/partials/topic/post.tpl +45 -27
  120. package/templates/partials/topic/quickreply.tpl +5 -5
  121. package/templates/partials/topic/reply-button.tpl +3 -3
  122. package/templates/partials/topic/sort.tpl +17 -5
  123. package/templates/partials/topic/tools.tpl +2 -2
  124. package/templates/partials/topic/topic-menu-list.tpl +22 -24
  125. package/templates/partials/topic/watch.tpl +42 -9
  126. package/templates/partials/topic-filters.tpl +6 -3
  127. package/templates/partials/topic-list-bar.tpl +50 -46
  128. package/templates/partials/topic-terms.tpl +6 -3
  129. package/templates/partials/topics_list.tpl +88 -93
  130. package/templates/partials/userFilter-placeholders.tpl +5 -0
  131. package/templates/partials/users/filter-dropdown-content.tpl +23 -0
  132. package/templates/partials/users/item.tpl +25 -27
  133. package/templates/partials/users_list.tpl +1 -1
  134. package/templates/popular.tpl +3 -1
  135. package/templates/post-queue.tpl +166 -0
  136. package/templates/recent.tpl +3 -2
  137. package/templates/register.tpl +4 -4
  138. package/templates/search.tpl +39 -177
  139. package/templates/tags.tpl +3 -3
  140. package/templates/top.tpl +3 -1
  141. package/templates/topic.tpl +74 -68
  142. package/templates/unread.tpl +3 -1
  143. package/templates/users.tpl +7 -3
  144. package/templates/modules/usercard.tpl +0 -39
  145. package/templates/partials/acceptTos.tpl +0 -11
  146. package/templates/partials/category-filter-content.tpl +0 -30
  147. package/templates/partials/category-filter-right.tpl +0 -5
  148. package/templates/partials/category-filter.tpl +0 -3
  149. package/templates/partials/category-selector-right.tpl +0 -5
  150. package/templates/partials/category-selector.tpl +0 -3
  151. package/templates/partials/slideout-menu.tpl +0 -6
@@ -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 gap-1 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="d-md-block alert alert-warning h-100 m-0 px-2 py-1 line-clamp-2 text-sm text-break hide" id="new-topics-alert">There is a new post. Click here to reload.</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-center">
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,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 class="topic-thumb rounded-1" width="80" height="auto" 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="text-break 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 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
+ {{{ 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>
@@ -0,0 +1,23 @@
1
+ <button type="button" class="btn-ghost-sm dropdown-toggle" data-bs-toggle="dropdown">
2
+ {{{ if selectedUser }}}
3
+ <span class="fw-semibold">{buildAvatar(selectedUser, "20px", true, "not-responsive")} {selectedUser.username}</span>
4
+ {{{ else }}}
5
+ <span class="fw-semibold">[[users:all-users]]</span>
6
+ {{{ end }}} <span class="caret"></span>
7
+ </button>
8
+ <ul class="dropdown-menu p-1 text-sm" role="menu">
9
+ <li role="presentation" class="user {{{ if !selectedUser}}}selected{{{end}}}">
10
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" role="menu-item" href="{config.relative_path}/{allUsersUrl}">
11
+ <div class="flex-grow-1">[[users:all-users]]</div>
12
+ <i class="flex-shrink-0 fa fa-fw {{{ if !selectedUser }}}fa-check{{{ end }}}"></i>
13
+ </a>
14
+ </li>
15
+ {{{ each users }}}
16
+ <li role="presentation" class="user {{{ if ./selected}}}selected{{{end}}}">
17
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" role="menu-item" href="{config.relative_path}/{./url}">
18
+ <div class="flex-grow-1 d-inline-flex gap-1 align-items-center">{buildAvatar(@value, "24px", true, "not-responsive")} {./username}</div>
19
+ <i class="flex-shrink-0 fa fa-fw {{{ if ./selected }}}fa-check{{{ end }}}"></i>
20
+ </a>
21
+ </li>
22
+ {{{end}}}
23
+ </ul>
@@ -1,39 +1,37 @@
1
- <a href="{config.relative_path}/user/{./userslug}" class="btn-ghost align-items-start justify-content-start">
1
+ <a href="{config.relative_path}/user/{./userslug}" class="btn-ghost align-items-start justify-content-start p-2 ff-base">
2
2
  {buildAvatar(@value, "48px", true, "flex-shrink-0")}
3
3
  <div class="d-flex flex-column text-truncate">
4
4
  <div class="fw-semibold text-truncate" title="{./displayname}">{./displayname}</div>
5
5
  <div class="text-xs text-muted text-truncate">@{./username}</div>
6
6
 
7
- <div class="align-self-start">
8
- {{{ if section_online }}}
9
- <div class="card card-header border rounded-1 py-0 px-1 text-xs">
10
- <span class="timeago" title="{./lastonlineISO}"></span>
11
- </div>
12
- {{{ end }}}
7
+ {{{ if section_online }}}
8
+ <div class="text-xs text-muted text-truncate">
9
+ <span class="timeago" title="{./lastonlineISO}"></span>
10
+ </div>
11
+ {{{ end }}}
13
12
 
14
- {{{ if section_joindate }}}
15
- <div class="card card-header border rounded-1 py-0 px-1 text-xs">
16
- <span class="timeago" title="{./joindateISO}"></span>
17
- </div>
18
- {{{ end }}}
13
+ {{{ if section_joindate }}}
14
+ <div class="text-xs text-muted text-truncate">
15
+ <span class="timeago" title="{./joindateISO}"></span>
16
+ </div>
17
+ {{{ end }}}
19
18
 
20
- {{{ if section_sort-reputation }}}
21
- <div class="card card-header border rounded-1 py-0 px-1 text-xs">
22
- <span class="formatted-number">{./reputation}</span>
23
- </div>
24
- {{{ end }}}
19
+ {{{ if section_sort-reputation }}}
20
+ <div class="text-xs text-muted text-truncate">
21
+ <span class="formatted-number">{./reputation}</span>
22
+ </div>
23
+ {{{ end }}}
25
24
 
26
- {{{ if section_sort-posts }}}
27
- <div class="card card-header border rounded-1 py-0 px-1 text-xs">
28
- <span class="formatted-number">{./postcount}</span>
29
- </div>
30
- {{{ end }}}
25
+ {{{ if section_sort-posts }}}
26
+ <div class="text-xs text-muted text-truncate">
27
+ <span class="formatted-number">{./postcount}</span>
28
+ </div>
29
+ {{{ end }}}
31
30
 
32
- {{{ if section_flagged }}}
33
- <div class="card card-header border rounded-1 py-0 px-1 text-xs">
34
- <span class="formatted-number">{./flags}</span>
35
- </div>
36
- {{{ end }}}
31
+ {{{ if section_flagged }}}
32
+ <div class="text-xs text-muted text-truncate">
33
+ <span class="formatted-number">{./flags}</span>
37
34
  </div>
35
+ {{{ end }}}
38
36
  </div>
39
37
  </a>
@@ -1,4 +1,4 @@
1
- <div id="users-container" class="users-container row row-cols-2 row-cols-md-3 row-cols-lg-4 row-cols-xl-5 g-2">
1
+ <div id="users-container" class="users-container row row-cols-2 row-cols-lg-3 row-cols-xl-4 g-4">
2
2
  {{{ each users }}}
3
3
  <!-- IMPORT partials/users/item.tpl -->
4
4
  {{{ end }}}
@@ -1,13 +1,15 @@
1
+ {{{ if widgets.header.length }}}
1
2
  <div data-widget-area="header">
2
3
  {{{each widgets.header}}}
3
4
  {{widgets.header.html}}
4
5
  {{{end}}}
5
6
  </div>
7
+ {{{ end }}}
6
8
  <div class="popular">
7
9
  <!-- IMPORT partials/topic-list-bar.tpl -->
8
10
  <div class="category">
9
11
  {{{ if !topics.length }}}
10
- <div class="alert alert-warning" id="category-no-topics">[[recent:no_popular_topics]]</div>
12
+ <div class="alert alert-info" id="category-no-topics">[[recent:no_popular_topics]]</div>
11
13
  {{{ end }}}
12
14
 
13
15
  <!-- IMPORT partials/topics_list.tpl -->